3

当 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;
    }
.....
4

0 回答 0