pIcmp->icmp_type = 8; // 请求一个ICMP回显
pIcmp->icmp_code = 0;
pIcmp->icmp_id = (USHORT)::GetCurrentProcessId();
pIcmp->icmp_checksum = 0;
pIcmp->icmp_sequence = 0;
// 填充数据部分,可以为任意
memset(&buff[sizeof(ICMP_HDR)], 'E', 32);

// 开始发送和接收ICMP封包
USHORT nSeq = 0;
char recvBuf[1024];
SOCKADDR_IN from;
int nLen = sizeof(from);
while(TRUE)
{
static int nCount = 0;
int nRet;
if(nCount++ == 4)
break;
pIcmp->icmp_checksum = 0;
pIcmp->icmp_timestamp = ::GetTickCount();
pIcmp->icmp_sequence = nSeq++;
pIcmp->icmp_checksum = checksum((USHORT*)buff, sizeof(ICMP_HDR) + 32);
nRet = ::sendto(sRaw, buff, sizeof(ICMP_HDR) + 32, 0, (SOCKADDR *)&dest, sizeof(dest));
if(nRet == SOCKET_ERROR)
{
printf(" sendto() failed: %d \n", ::WSAGetLastError());
return -1;
}
代码里没有 bind ,没有listen 1模拟ping的的程序, 为什么要用udp(sento函数)2端口是:htons(0);  为什么是这个呢?

解决方案 »

  1.   

    这是raw socket
    百度 raw socket 一切明了..
      

  2.   

    ICMP协议在IP 和TCP/UDP之间,需要按它的协议格式构建包数据
      

  3.   

    回复楼上, 原始套接字,我是看过书的,书上并没有说明为什么要用sendto而不用send我查过资料,有人说,如果用send,那么必须connect,而ping的原理是在没有connect的基础上去发送数据,所以只能用sendto为什么要是  htons(0),确实不能理解.我在cmd下输入了 ping /?  获得 ping程序的帮助文档,发现 没有 要指定端口!!!!端口的引入是 tcp/udp 协议中开始引入的。有人说,icmp是没有用过tcp/udp的,         猜测是这个原因,所以不需要端口。也就是说明:htons(0)完全是多余的。!!!icmp协议 仅仅用到了 ip层
      

  4.   

    1模拟ping的的程序, 为什么要用udp(sento函数)
    可以使用send,只是说一般面向无连接的使用了sendto而已
    ping协议既不是使用UDP,也不是TCP
    ================
    2端口是:htons(0); 为什么是这个呢?
    随意吧,端口对于ICMP协议来说本来就没啥价值