用两个线程分别对两组IP模拟ping功能:SOCKET rawSocket;
rawSocket=socket(AF_INET, SOCK_RAW,IPPROTO_ICMP);
FD_SET readfds;
FD_ZERO(&readfds); 
FD_SET(rawSocket,&readfds); 
int ii=select(nfds,&readfds,NULL,NULL,&timeout);
以上语句在ontimer()创建的线程A中,端口号为3000
//////////////////////////////////////////
SOCKET rawSocket2;
rawSocket2=socket(AF_INET, SOCK_RAW,IPPROTO_ICMP);
FD_SET readfds;
FD_ZERO(&readfds); 
FD_SET(rawSocket2,&readfds); 
int ii=select(nfds,&readfds,NULL,NULL,&timeout);
这部分语句在另一个线程B中,是个死循环,端口号为4000在计时时,线程B的结果正常,当计时完成,线程A运行时,线程B接受的数据就是A的数据了,但线程A的结果不受影响.两组IP无重复。
两个线程的socket怎么会发生关联呢?如何使A不影响B?
还请大家不吝赐教.我还有一个帖子,80分,问题已自己解决,但论坛中还没人给出正确答案.解决这个问题的大虾将得到这80分.
该贴信息:
主  题:  80分求助ping程序的问题  
所属社区:  VC/MFC 网络编程  
发表时间:  2007-2-27 10:45:35 
当然,需要你在该贴上发一个回复!!!!!!

解决方案 »

  1.   

    看得不是很明白,如果连接到的机器向4000端口发数,必然是B线程收到数据,这是很正常的。说两个socket发生关联,应该是连接到的机器的原因。它收到A线程数据后向4000端口返回结果了。不知说的对不对。
      

  2.   

    1.首先不明白ping程序和端口号有关系吗?icmp服务在ip层啊
       2.由于tcp/ip协议栈中的icmp直接使用ip层进行通信,实际上在ip层看来是不存在套接字这个概念的(套接字只针对tcp/udp),所以你创建的套接字是“虚”的,该进程内任何一个raw socket接受(recv)操作都可以接受到由操作系统tcp/ip协议栈中icmp模块的数据。当然,返回过来的(icmp回显应答包)总量应该和icmp回显请求包总数应该是一致的,除非出现丢包。
       3.Unix系统在实现ping程序时是把icmp报文中的标识符字段置成发送进程的I D号。这样即使在同一台主机上同时运行了多个ping程序实例,ping程序也可以识别出返回的信息(摘自unp1);从上边这句话也可以看出,在icmp看来不存在socket这个概念