BOOL CheckHostStatus(CString &strIPAddr)
{
char destip[20] ;
sprintf(destip,"%s",strIPAddr.GetBuffer(strIPAddr.GetLength()));
//定义变量
SOCKET m_hSocket;
SOCKADDR_IN m_addrDest;
SOCKADDR_IN m_addrFrom;
char *icmp_data;
char *recvbuf;
USHORT seq_no ;
char *lpdest;
int datasize;
BOOL m_bRecordRout;
int timeout;
int recvicmpnum;
int ret = 0;
//初始化变量
icmp_data = NULL;
seq_no = 0;
recvbuf = NULL;
m_bRecordRout = FALSE;
lpdest = NULL;
datasize = DEF_PACKET_SIZE;
m_hSocket = INVALID_SOCKET;
recvicmpnum = 0;
//初始化套接字
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
return 0;
}
m_bRecordRout = FALSE;
lpdest = destip;
m_hSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if (m_hSocket == INVALID_SOCKET)
{
return FALSE ;
}
timeout = 100;
ret = setsockopt(m_hSocket, SOL_SOCKET, SO_RCVTIMEO,
(char*)&timeout, sizeof(timeout));
if(ret == SOCKET_ERROR)
{
if (m_hSocket != INVALID_SOCKET) {
closesocket(m_hSocket);
}
return FALSE;
}
ret = setsockopt(m_hSocket, SOL_SOCKET, SO_SNDTIMEO,
(char*)&timeout, sizeof(timeout));
if (ret == SOCKET_ERROR)
{
if (m_hSocket != INVALID_SOCKET) {
closesocket(m_hSocket);
}
return FALSE;
}
memset(&m_addrDest, 0, sizeof(m_addrDest));
m_addrDest.sin_family = AF_INET;
if ((m_addrDest.sin_addr.s_addr = inet_addr(lpdest)) == INADDR_NONE)
{
if (m_hSocket != INVALID_SOCKET) {
closesocket(m_hSocket);
}
return FALSE;
}
//
// Create the ICMP packet
//
datasize += sizeof(IcmpHeader);
icmp_data =(char*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,MAX_PACKET);
if (!icmp_data)
{
if (m_hSocket != INVALID_SOCKET) {
closesocket(m_hSocket);
}
return FALSE;
}
recvbuf =(char*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,MAX_PACKET);
if (!recvbuf)
{
if (m_hSocket != INVALID_SOCKET) {
closesocket(m_hSocket);
}
return FALSE;
}
memset(icmp_data,0,MAX_PACKET);
//重要函数,填充ICMP包头
FillICMPData(icmp_data,datasize);
((IcmpHeader*)icmp_data)->i_cksum = 0;
((IcmpHeader*)icmp_data)->timestamp = GetTickCount();
((IcmpHeader*)icmp_data)->i_seq = seq_no++;
((IcmpHeader*)icmp_data)->i_cksum = CheckSum((USHORT*)icmp_data, datasize);
DWORD time=GetTickCount();
ret = sendto(m_hSocket, icmp_data, datasize, 0,
(struct sockaddr*)&m_addrDest, sizeof(m_addrDest));
if (ret == SOCKET_ERROR)
{
if (m_hSocket != INVALID_SOCKET) {
closesocket(m_hSocket);
}
HeapFree(GetProcessHeap(), 0, recvbuf );
HeapFree(GetProcessHeap(), 0, icmp_data);
WSACleanup();
return FALSE;
}
int fromlen = sizeof(m_addrFrom);
time= GetTickCount();
ret = recvfrom(m_hSocket, recvbuf, MAX_PACKET, 0,
(struct sockaddr*)&m_addrFrom, &fromlen);
if (ret == SOCKET_ERROR)
{
if (m_hSocket != INVALID_SOCKET) {
closesocket(m_hSocket);
}
HeapFree(GetProcessHeap(), 0, recvbuf );
HeapFree(GetProcessHeap(), 0, icmp_data);
WSACleanup();
return FALSE;
}
if (m_hSocket != INVALID_SOCKET) {
closesocket(m_hSocket);
}
HeapFree(GetProcessHeap(), 0, recvbuf );
HeapFree(GetProcessHeap(), 0, icmp_data);
return TRUE;
}
本文介绍了一个使用ICMP协议检查远程主机状态的C++实现。通过创建原始套接字并发送ICMP请求,该函数能够判断目标IP地址是否可达。文章详细展示了初始化网络环境、构建ICMP数据包、设置超时时间以及接收响应的过程。
2070

被折叠的 条评论
为什么被折叠?



