当 recvfrom API 中没有数据时,我尝试使用 SO_RCVTIMEO 选项超时。但是这并没有生效,而且源头没有数据的时候,代码就卡住了。
我什至尝试使用 recv 而不是 recvfrom。还是同样的问题。
如果我的代码中缺少任何内容,请告诉我。
int sock_r=socket(AF_PACKET,SOCK_RAW,htons(ETH_P_ALL));
if(sock_r<0)
{
printf("open_raw_socket(): error in opening the socket");
return -1;
}
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
int ret = setsockopt(sock_r, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
perror("error: ");
socklen_t ntrcv, ntsnd;
struct timeval trcv;
ntrcv = sizeof(struct timeval);
if (getsockopt(sock_r, SOL_SOCKET, SO_RCVTIMEO, &trcv, &ntrcv) < 0)
{
perror("2");
TF_MSG("error");
}
while(1)
{
saddr_len=sizeof saddr;
recv_len = recvfrom(sock_r,buffer,buflen,0,&saddr,(socklen_t *)&saddr_len);
if(recv_len<=0)
{
printf("error in reading recvfrom function");
return 0;
}
.....