// 设置包长度
datasize = DEF_PACKET_SIZE;
// 计算包大小
datasize = sizeof(IcmpHeader);
icmp_data = (char *)new[MAX_PACKET]; //分配内存,可以用new 和 delete
recvbuf = (char *)new[MAX_PACKET];
if (!icmp_data)
{
// 释放内存,退出
}
if (!recvbuf)
{
// 释放内存,退出 }
}
memset(icmp_data,0,MAX_PACKET);
fill_icmp_data(icmp_data,datasize); // 这个函数用来填充ICMP的数据包
int bwrote;
((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);
// 为了最后计算ICMP包回来的总时间
unsigned long tc = GetTickCount();
//发送数据包
bwrote = sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&dest, sizeof(dest));
if (bwrote == SOCKET_ERROR)
{
// 错误
}
if (bwrote < datasize ) //发送字节数对否
{
}
// 接受数据包
bread = recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&from,
&fromlen);
//计算总时间
ms = GetTickCount() - tc;
if (bread == SOCKET_ERROR)
{
// 错误
}
// 得到返回的路由器
ipback = from.sin_addr.s_addr;
return 1;
}
===============================
函数fill_icmp_data()的源代码
===============================
//这个结构下面将用到
typedef struct _ihdr {
BYTE i_type;
BYTE i_code;
USHORT i_cksum;
USHORT i_id;
USHORT i_seq;
ULONG timestamp; /* 这不是ICMP包的一部分, 只是为了计算时间 */
}IcmpHeader;
void fill_icmp_data(char * icmp_data, int datasize){
IcmpHeader *icmp_hdr;
char *datapart;
icmp_hdr = (IcmpHeader*)icmp_data;
icmp_hdr->i_type = ICMP_ECHO;
icmp_hdr->i_code = 0;
icmp_hdr->i_id = (USHORT)GetCurrentProcessId();
icmp_hdr->i_cksum = 0;
icmp_hdr->i_seq = 0;
datapart = icmp_data sizeof(IcmpHeader); //计算数据域的开始地址
// 初试化数据域
memset(datapart,'E', datasize - sizeof(IcmpHeader));
}
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




