采用以下网页提供的ping的方法:
http://www.pcbookcn.com/article/1121.htm
已经可以实现ping单个主机了,(winsock2.h)
现在打算使用多线程的方法来同时ping多台主机,在实现时并不能达到预期的效果,
不知是什么原因,望赐教,谢谢!
多线程的代码如下:char ip1[16] = "192.168.1.1";
char ip2[16] = "192.168.1.2"
int i = 0;for(i=1; i<=2; i++)
{
AfxBeginThread(DoPing, (LPVOID)i);
Sleep(500);
}UINT DoPing(LPVOID pParam)
{
int locali = 0;
int ret = 0;
char strIP[16];
locali = (int)pParam;
if(locali == 1)
{
strcpy(strIP, ip1)
}
else if(locali == 2)
{
strcpy(strIP, ip1)
}
else
return 1;
ret = ping(strIP);
if(ret < 0)
printf("fail to ping host: %s\n", strIP);
else
printf("success to ping host: %s\n", strIP);
return 0;
}现象为:
如果单独ping ip1,那么可以ping通;
如果单独ping ip2,那么无法ping通;
但使用多线程来ping时,返回的结果是都能ping通,为什么会这样呢?

解决方案 »

  1.   

    多线程PING好象不太实用.
    因为多线程都用一个进程号,当程序执行完后,返回给这个进程号的数据包.
    因为都是同一个进程号,每个线程都接受到了这些返回的包,然后被处理成都PING通了.
      

  2.   

    那么是否意味着多线程无法实现同时ping呢?
    只能采用多进程了?如果使用用户界面的多线程呢?
      

  3.   

    你上面的程序ping单个IP,只要返回ICMP包就算ping通实际上应该如此: 比较返回的ICMP包里的IP是否为你PING出去的IP,不是,则不通。多线程会有这样的情况,A线程PINGIP1,B线程PINGIP2, A线程在接收ICMP包的时候接收到B线程的包,结果比较后发现不是A的IP,则以为PING不通。实际上A线程的回应包可能在B线程的回应包之后到来。解决方法: 一次的ping对应多次的接收for(i = 0; i < IP个数; i++)
    {
       1、接收回应包
       2、比较IP
       3、if(IP == 本线程ping出去的IP)
           //ping 通;
          else
            continue;
    }
    //ping不通
      

  4.   

    我试试
    感兴趣的也可以参考这篇文章:
    http://community.csdn.net/Expert/topic/3306/3306811.xml?temp=.4610712
    这里也有Caps77的答复,在此,先表示感谢!
      

  5.   

    考虑使用两个线程,一个发送ping包,一个接收回复的包,
    根据回复的包来确定能否ping通远程主机。
    但返回的包是否会混在一起呢?如果会,那么在解析包时就比较麻烦了。
      

  6.   

    我晕,这就是黑箱技术的"好处"阿,大家不明白原理,拿来就用,结果......你的icmp包里面有对方地址ip的信息,同时,icmp报可以让你放一定量的数据,你也可以通过放不同的数据来判断到底是哪一台主机的ping回应。总之,我看你是要去改改那个黑箱子了。