摘要:
发送原始UDP封包时:1 以IPPROTO_UDP 为协议类型创建一个原始套接字,打开原始套接字上的IP_HDRINCL选项2 构建UDP封包,要先设置IP头,设置UDP头,最后UDP净荷数据。3 初始化完整的UDP封包之后,调用sendto函数即可将他发送。计算UDP封包校验和的过程如下:void ComputeUdpPseudoHeaderChecksum( IPHeader *pIphdr, UDPHeader *pUdphdr, char *payload, int payloadlen ){ char buff[1024]; ... 阅读全文
posted @ 2012-10-21 21:57
xingoo
阅读(4195)
评论(0)
推荐(0)
摘要:
用来确定路由器的IP地址,也就是在网络上到达特定主机所经过的计算机。程序需要两个套接字:1 一个用于接收ICMP封包的原始套接字sRaw2 用于发送TTL不断增加UDP封包的套接字sSend。实现代码如下:void main(){ char *szDestIp = "10.16.115.178"; // 210.181.18.12910.16.115.25 61.55.66.30 char recvBuf[1024] = { 0 }; // 创建用于接收ICMP封包的原始套节字,绑定到本地端口 SOCKET sRaw = ::socket(AF_INET, SOCK_R.. 阅读全文
posted @ 2012-10-21 21:51
xingoo
阅读(401)
评论(0)
推荐(0)
摘要:
发送ICMP报文时,必须程序自己计算校验和,将它填入ICMP头部对应的域中。校验和的计算方法: 将数据以字为单位累加到一个双字中,如果数据长度为奇数,最后一个字节将被扩展到字,累加的结果是一个双字,最后将这个双字的高16位,低16位相加后取反,便得到了校验和。下面是checksum的计算校验和的代码:USHORT checksum(USHORT* buff, int size){ unsigned long cksum = 0; while(size>1) { cksum += *buff++; size -= sizeof(USHORT); ... 阅读全文
posted @ 2012-10-21 21:39
xingoo
阅读(2752)
评论(0)
推荐(1)
摘要:
原始套接字有两种:1 在IP头中使用预定义的协议2 在IP头中使用自定义的协议创建原始套接字使用socket或者WSASocket,代码如下:SOCKET sRaw = ::socket(AF_INET,SOCK_RAW,IPPROTO_ICMP)原始套接字提供管理下层传输的能力,仅administrator组的成员能够创建SOCK_RAW类型的套接字。 阅读全文
posted @ 2012-10-21 21:04
xingoo
阅读(237)
评论(0)
推荐(0)