关于MSDN里的例子:ping.c  
源代码有点长,MSDN里有
有几个问题:
1.例子里是先构造了一个ICMP包,发送出去后,用recvfrom接收,为什么接受的数据包含有了IP题头呢?而发送的ICMP包为什么只有ICMP题头?
2.利用代码GetTickCount()-icmphdr->timestamp能计算出大概时间吗?icmphdr->timestamp的值是接受数据包的timestamp呀,这样相减的结果好像不是数据传送所需的时间呀?莫非接受数据包的icmphdr->timestamp值和发送数据包的icmphdr->timestamp值相同?
3.发送的ICMP包的题头的i_id好像没有赋值呀?
4.是不是只要发送ICMP包的type值是ICMP_ECHO,那么目的主机收到这种数据包后就会自动回复一个ICMP_ECHOREPLY 类型的数据包呀?如果不是ICMP_ECHO类型,目的主机就不会自动回复数据包啦?
问题有点多,不过实在迷茫,谁知道帮帮我呀,回答一点也行....先谢谢了.

解决方案 »

  1.   

    icmp协议只是一个ip层的协议,当然只能有ip头了,如果加上tcp udp头不就成了传输层的协议了么?
    所以每一层有每一层的协议
      

  2.   

    1.例子里是先构造了一个ICMP包,发送出去后,用recvfrom接收,为什么接受的数据包含有了IP题头呢?而发送的ICMP包为什么只有ICMP题头? 如果你不指定是否自己构造IP头,应用程序帮你补上。但是接的时候是包括IP头的2.利用代码GetTickCount()-icmphdr->timestamp能计算出大概时间吗?icmphdr->timestamp的值是接受数据包的timestamp呀,这样相减的结果好像不是数据传送所需的时间呀?莫非接受数据包的icmphdr->timestamp值和发送数据包的icmphdr->timestamp值相同?发的时候设置个时间到timestamp,接的时候本地计算下时间,两者相减3.发送的ICMP包的题头的i_id好像没有赋值呀? 

    这个忘记了。肯定需要标志符。
    4.是不是只要发送ICMP包的type值是ICMP_ECHO,那么目的主机收到这种数据包后就会自动回复一个ICMP_ECHOREPLY 类型的数据包呀?如果不是ICMP_ECHO类型,目的主机就不会自动回复数据包啦?

    这个需要你自己查看下ICMP的代码表