⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arwinnettool_t.cpp

📁 wangchuanDll.rar 网络传输的DLL 源代码
💻 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 + -