📄 arwinnettool_t.cpp
字号:
#include "ArWinNetTool_T.h"
#include <WinSock2.h>
#include <stdio.h>
//-------------------------------------------------------------------------------
//puclic code
//网际校验和生产算法
//网际校验和是被校验数据16位值的反码和(ones-complement sum)
unsigned short in_cksum(unsigned short* addr, int len)
{
int nleft = len;
int sum = 0;
unsigned short* w = addr;
unsigned short answer = 0;
while(nleft > 1) {
sum += *w++;
nleft -= 2;
}
if(nleft == 1) {
*(unsigned char*)(&answer) = *(unsigned char*)w;
sum += answer;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
answer = ~sum;
return (answer);
}
void fill_IcmpData(char *buf, int datasize)
{
if (buf)
{
char ch = 0;
char* icmpdata = buf + sizeof(XIcmpHeader);
for (int i = 0; i < datasize; i++)
{
ch = 'A' + i%('z' - 'A');
*(icmpdata + i) = ch;
}
}
}
void fill_IcmpHeader(char *buf, int datasize)
{
static unsigned short seq_no = 0;
XIcmpHeader *icmp_hdr = (XIcmpHeader *)buf;
if (icmp_hdr)
{
icmp_hdr->i_type = ICMP_ECHO;
icmp_hdr->i_code = 0;
icmp_hdr->i_cksum = 0;
icmp_hdr->i_id = (unsigned short)GetCurrentProcessId();
icmp_hdr->i_seq = seq_no++;
icmp_hdr->i_timestamp = (unsigned long)::GetTickCount();
icmp_hdr->i_cksum = in_cksum((unsigned short*)buf, sizeof(XIcmpHeader) + datasize);
}
}
// decode
int decode_IpIcmp(char *buf, int size)
{
XIpHeader *ip_hdr = (XIpHeader *)buf;
unsigned short iphdrlen;
if (ip_hdr)
{
//iphdrlen = ip_hdr->h_len * 4; // number of 32-bit words *4 = bytes
iphdrlen = ip_hdr->h_len << 2; // number of 32-bit words *4 = bytes
if (size < iphdrlen + ICMP_MIN)
{
}
else
{
XIcmpHeader *icmp_hdr = (XIcmpHeader *)(buf + iphdrlen);
unsigned long timestamp = 0;
timestamp = (unsigned long)::GetTickCount();
timestamp -= icmp_hdr->i_timestamp;
struct sockaddr_in from;
from.sin_addr.s_addr = ip_hdr->sourceIP;
return timestamp;
}
}
return -1;
}
//---------------------------------------------------------
ArWinNetTool_T::ArWinNetTool_T()
{
m_PingSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
int timeout = MAX_PERMIT_TIME;
setsockopt(m_PingSocket, SOL_SOCKET, SO_RCVTIMEO,
(char*)&timeout, sizeof(timeout));
setsockopt(m_PingSocket, SOL_SOCKET, SO_SNDTIMEO,
(char*)&timeout, sizeof(timeout));
}
//---------------------------------------------------------
ArWinNetTool_T::~ArWinNetTool_T()
{
closesocket(m_PingSocket);
}
//---------------------------------------------------------
unsigned long __stdcall ArWinNetTool_T::StrToAddress(char* strAddressInfo)
{
return(inet_addr(strAddressInfo));
}
//---------------------------------------------------------
bool _stdcall ArWinNetTool_T::AddressToStr(unsigned long ulAddress, char* pStrAddress)
{
struct in_addr Address;
Address.S_un.S_addr = ulAddress;
sprintf(pStrAddress, "%s", inet_ntoa(Address));
return true;
}
//---------------------------------------------------------
bool __stdcall ArWinNetTool_T::LocalAddress(unsigned long& ulAddress)
{
struct hostent* LocalHosten;
char strHostName[200];
if(gethostname(strHostName, 200) == SOCKET_ERROR)
{
return false;
}
LocalHosten = gethostbyname(strHostName);
struct in_addr LocalAddress = *(struct in_addr*)LocalHosten->h_addr_list[0];
ulAddress = LocalAddress.S_un.S_addr;
return true;
}
//---------------------------------------------------------
bool __stdcall ArWinNetTool_T::PingRemote(unsigned long ulAddress, int& iTime)
{
if(ulAddress == INADDR_NONE)
{
iTime = 0;
return false;
}
int iIcmpDataSize = 10;
struct sockaddr_in dest,from;
unsigned int addr = 0;
struct hostent *hp;
char buffer[1024];
char recv_buffer[1024];
memset(&dest, 0, sizeof dest);
dest.sin_family = AF_INET;
char strAddress[40];
AddressToStr(ulAddress, strAddress);
hp = gethostbyname(strAddress);
if(!hp)
{
dest.sin_addr.s_addr = ulAddress;
}
else
{
memcpy(&(dest.sin_addr), hp->h_addr,hp->h_length);
dest.sin_addr.s_addr = ulAddress;
}
memset(buffer, 0, 1024);
fill_IcmpData(buffer, iIcmpDataSize);
fill_IcmpHeader(buffer, iIcmpDataSize);
XIcmpHeader *icmp_hdr = (XIcmpHeader *)buffer;
int iSendSize = sendto(m_PingSocket, buffer, sizeof(XIcmpHeader) + iIcmpDataSize, 0, (struct sockaddr*)&dest, sizeof(dest));
memset(&from, 0, sizeof from);
memset(recv_buffer, 0, 1024);
int fromlen = sizeof(from);
int iRecvSize = recvfrom(m_PingSocket, recv_buffer, 1024, 0, (struct sockaddr*)&from, &fromlen);
if (iRecvSize > 0)
{
iTime = decode_IpIcmp(recv_buffer, iRecvSize);
return true;
}
iTime = MAX_PERMIT_TIME;
return false;
}
//---------------------------------------------------------
bool __stdcall ArWinNetTool_T::Destroy(void)
{
delete this;
return true;
}
//---------------------------------------------------------
bool __stdcall ArWinNetTool_T::GetHostName(char* strName, int iStrLength)
{
return (gethostname(strName, iStrLength) == 0);
}
//---------------------------------------------------------
bool __stdcall ArWinNetTool_T::ParseAddress(unsigned long ulAddress,
int* pa,
int* pb,
int* pc,
int* pd)
{
if(pa)
{
*pa = ulAddress & 0xFF;
}
if(pb)
{
*pb = ulAddress >> 8 &0xFF;
}
if(pc)
{
*pc = ulAddress >> 16 & 0xFF;
}
if(pd)
{
*pd = ulAddress >> 24 & 0xFF;
}
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -