ICMP响应接收:
/*接收ping目的主机的回复*/
static void *icmp_recv(void *argv)
{
/*轮询等待时间*/
struct timeval tv;
tv.tv_usec = 200;
tv.tv_sec = 0;
fd_set readfd;
/*当没有信号发出一直接收数据*/
while(alive)
{
int ret = 0;
FD_ZERO(&readfd);
FD_SET(rawsock, &readfd);
ret = select(rawsock+1,&readfd, NULL, NULL, &tv);
switch(ret)
{
case -1:
/*错误发生*/
break;
case 0:
/*超时*/
break;
default:
{
/*接收数据*/
int size = recv(rawsock, recv_buff,sizeof(recv_buff),
0);
if(errno == EINTR)
{
perror("recvfrom error");
continue;
}
/*解包,并设置相关变量*/
ret = icmp_unpack(recv_buff, size);
if(ret == -1)
{
continue;
}
}
break;
}
}
}