模拟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++)
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++)
为了这个问题险些倾家荡产。郑重声明:此分归我本人,之后的答复如能解释清原因,最多给15分!!!!!!!!!!!!!!!!!!!!
不是我不守信用哟