手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络知识>网络协议>列表

透析ICMP协议(五): 应用篇路由追踪

来源:互联网 作者:west263.com 时间:2008-02-22
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

// 设置包长度
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
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!