模拟ping程序,对每个ip地址发送四个请求,应该受到四个回应。但有时一个ip能收到5~6个回应,而他的下一个ip就会相应少收1~2个回应,困扰多时,望大家帮忙。下面是收到的数据的一部分:
RIGHT 202.108.22.147 reply 52 bytes seq=46
RIGHT 202.108.22.147 reply 52 bytes seq=46
RIGHT 202.108.22.147 reply 52 bytes seq=46
RIGHT 202.108.22.147 reply 52 bytes seq=46
RIGHT 192.168.0.253 reply 52 bytes seq=47
RIGHT 192.168.0.253 reply 52 bytes seq=47
RIGHT 192.168.0.253 reply 52 bytes seq=47
RIGHT 192.168.0.253 reply 52 bytes seq=47
RIGHT 202.108.22.147 reply 52 bytes seq=48
RIGHT 202.108.22.147 reply 52 bytes seq=48
RIGHT 202.108.22.147 reply 52 bytes seq=48
RIGHT 202.108.22.147 reply 52 bytes seq=48
//49号出现5次,50次出现3次,有时是前一个ip6个回应,下一个2个回应。两者刚好8次。期望收到四个49四个50
RIGHT 192.168.0.253 reply 52 bytes seq=49
RIGHT 192.168.0.253 reply 52 bytes seq=49
RIGHT 192.168.0.253 reply 52 bytes seq=49
RIGHT 192.168.0.253 reply 52 bytes seq=49
RIGHT 192.168.0.253 reply 52 bytes seq=49
RIGHT 202.108.22.147 reply 52 bytes seq=50
RIGHT 202.108.22.147 reply 52 bytes seq=50
RIGHT 202.108.22.147 reply 52 bytes seq=50
RIGHT 192.168.0.253 reply 52 bytes seq=51
RIGHT 192.168.0.253 reply 52 bytes seq=51
RIGHT 192.168.0.253 reply 52 bytes seq=51
RIGHT 192.168.0.253 reply 52 bytes seq=51
下面是程序的框架流程:
期望解决:如何才能使每个命令收到且只收到四个回应呢?????????
在线等,解决即给分!!!!!!!!!!!!!!!!!!!!!
int arrsize=m_iparr.GetSize();
for(int i=0;i<arrsize;i++)
{
m_sHostName=m_iparr[i];
//获取目标机信息
SOCKADDR_IN destsocket;
hostent *pHostent;
memset(&destsocket,0,sizeof(SOCKADDR_IN));
pHostent=gethostbyname(m_sHostName);
if(!pHostent)
{
continue;
}

//确定目标机地址
destsocket.sin_addr.S_un.S_addr=((in_addr*)(pHostent->h_addr))->S_un.S_addr;//获取目地址
destsocket.sin_family=AF_INET;
destsocket.sin_port=htons(3000);
char *ipadd=inet_ntoa(destsocket.sin_addr); //创建ICMP数据包
char  buff[maxsize];
memset(buff,0,maxsize);
fill_IcmpData(buff, iIcmpDataSize);
fill_IcmpHeader(buff, iIcmpDataSize);
PICMPHEAD icmp_hdr = (PICMPHEAD)buff;

int j=0;
int sendnum=0;
while(j<4)
{

//定义套接字
SOCKET rawSocket;
rawSocket=socket(AF_INET, SOCK_RAW,IPPROTO_ICMP);//IPPROTO_ICMP); 

//发送回显请求数据
int si=sendto(rawSocket,buff,sizeof(ICMPHEAD)+iIcmpDataSize,0,(struct sockaddr*)&destsocket,sizeof(SOCKADDR));

sendnum++;
if(si==SOCKET_ERROR)
{
if(sendnum<4)
{
j++;
continue;
}
else 
break;
}//if(i==SOCKET_ERROR)

//接收数据
SOCKADDR_IN from;
char rcvbuff[rcvmaxsize];
memset(rcvbuff,0,rcvmaxsize);
int fromlen=sizeof(SOCKADDR);
memset(rcvbuff,'r',rcvmaxsize);
int k;
//定义等待时间
FD_SET readfds;//writefds,expectfds;
int nfds=0;
struct timeval timeout;
timeout.tv_sec=0;
timeout.tv_usec=5000;//等待5毫秒 
FD_ZERO(&readfds); 
FD_SET(rawSocket,&readfds); 
while(1)
{
int ii=select(nfds,&readfds,NULL,NULL,&timeout);//&writefds,&expectfds,
if(ii==0)
{
break;
}
if(ii==SOCKET_ERROR)
{
break;
}
if(ii>0)
{
k=recvfrom(rawSocket,rcvbuff,rcvmaxsize, 0,(struct sockaddr*)&from, &fromlen); 
if(k==SOCKET_ERROR)
{
break;
}
break;
}//if(ii>0)
}//while(1)
j++;
}//while(j<4)
}//for(int i=0;i<arrsize;i++)

解决方案 »

  1.   

    无意中竟把问题解决了:在select后加上sleep(100)就不出异常了。可能是select的返回有关。
    为了这个问题险些倾家荡产。郑重声明:此分归我本人,之后的答复如能解释清原因,最多给15分!!!!!!!!!!!!!!!!!!!!
    不是我不守信用哟
      

  2.   

    你自己看看select模型或者你用多线程应该不会有问题
      

  3.   

    如果你开线程的,就有得考虑时间,也就是SLEEP