1、自己写的ping的time和windows自带ping出来的time值差异很大,time是由GetTickCount在初始化ICMP报头时计算的;数量级的差异2、对于超时的目标主机,我的程序就停在recvfrom里了,不会返回SOCKET_ERROR;3、TTL(1~255)值是如何计算出来的呢?ping不同的主机得到的不同啊

解决方案 »

  1.   

    我觉得,ping的时间不一样,主要是技术开始位置的差异,应该放在send成功后吧,关于recvfrom的问题,是不是在主线程里面啊,那样,进程就会进入sleep状态,建议在新开的线程里进行,然后再超时处理,就想TCP包一样.
      

  2.   

    TTL全程Time to Live,意思就是生存周期。每个操作系统对TTL值得定义都不同,这个值甚至可以通过修改某些系统的网络参数来修改,例如Win2000默认为128,通过注册表也可以修改。而Linux大多定义为64。不过一般来说,很少有人会去修改自己机器的这个值的,这就给了我们机会可以通过ping的回显TTL来大体判断一台机器是什么操作系统。 以我公司2台机器为例 
    看如下命令 
    D:Documents and Settingshx>ping 61.152.93.131 Pinging 61.152.93.131 with 32 bytes of data: Reply from 61.152.93.131: bytes=32 time=21ms TTL=118 
    Reply from 61.152.93.131: bytes=32 time=19ms TTL=118 
    Reply from 61.152.93.131: bytes=32 time=18ms TTL=118 
    Reply from 61.152.93.131: bytes=32 time=22ms TTL=118 Ping statistics for 61.152.93.131: 
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss 
    Approximate round trip times in milli-seconds: 
    Minimum = 18ms, Maximum = 22ms, Average = 20ms D:Documents and Settingshx>ping 61.152.104.40 Pinging 61.152.104.40 with 32 bytes of data: Reply from 61.152.104.40: bytes=32 time=28ms TTL=54 
    Reply from 61.152.104.40: bytes=32 time=18ms TTL=54 
    Reply from 61.152.104.40: bytes=32 time=18ms TTL=54 
    Reply from 61.152.104.40: bytes=32 time=13ms TTL=54 Ping statistics for 61.152.104.40: 
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss 
    Approximate round trip times in milli-seconds: 
    Minimum = 13ms, Maximum = 28ms, Average = 19ms 
    第一台TTL为118,则基本可以判断这是一台Windows机器,从我的机器到这台机器经过了10个节点,因为128-118=10。而第二台应该是台Linux,理由一样64-54=10。
      

  3.   

    nij_nick(阿拉):多谢你的解答,ttl得值确实不同os返回不同,除了你上面说的两个,solaris返回可能是255,可ping之后能回显出这个值,那么返回报文里面应该能体现出该值的变量才是啊,这个不知如何得到;
    你说ping时间的不同可以放在sendto后面,晚上回去我试试;
    对于超时的目标主机,recvfrom应该返回错误的结果不是吗?我没有创建其他线程,主线程会一直等候下去吗?msdn里面不是说了会返回error吗,总觉得有点不是很理解
      

  4.   

    1.你的程序有问题。
    2。是否设置了超时
    3.ICMP报文中有这个域
      

  5.   

    我这样设置超时,是否可行?
    #include "windows.h"
    #include "winsock2.h"VOID CALLBACK TimeProc(...)
    DWORD WINAPI subThread(...)void main()
    {....
      CreateThread(...,subThread,....)
    ...
    }DWORD WINAPI subThread(...)
    {
      settimer( ...,5000,TimePorc,...)
      recvfrom(...)//receive datagram
    }
    VOID CALLBACK TimeProc(...)
    {
      //这个地方是否该加点判断recvfrom返回语句?但是我的recvfrom就sleep那了阿,无返回,可以 没有的话,如果对于能收到数据包的主机来说,隔5000ms后,仍然会显示“time out”?
      cout<<"time out"<<endl;
    }还有,如果对一个ip只发送一次包,接收一个包的话,会不会出现丢包的可能,那么发送多少次呢?另外,假如对于要ping很多主机来说,考虑多线程,我这样策略是否合适:只创建一个套接字,对所有ip循环sendto数据包,然后对每个ip创建一个线程,利用互斥进行同步,分别接受,再对recvfrom结果分别判断。