如果没有收到数据,如何防止接收套接字永远阻塞?

时间:2016-12-01 07:44:13

标签: sockets networking udp system-calls blocking

如果阻塞UDP套接字blocking on receive不接收任何数据,并且不会接收任何数据,因为发送方进程由于某种原因而崩溃。 可以设置套接字选项SO_RCVTIMEO以确保接收系统调用将返回,但是有一种已知的方法"解决这个问题(因为超时的值不准确,取决于系统是否很慢)

1 个答案:

答案 0 :(得分:2)

您可以使用select函数来了解可以在套接字上读取的内容。

while (1)
{
    int retval;
    fd_set rfds;
    // one second timeout
    struct timeval tv = {1,0};

    FD_ZERO(&rfds);
    FD_SET(fd, &rfds);

    retval = select(1, &rfds, NULL, NULL, &tv);

    if (retval == -1)
    {
        perror("select()");
        exit(1);
    }        
    else if (retval)
    {
        printf("Data is available now.\n"); 
        // if recvfrom() is called here, it won't block
    }
    else
    {
        // no data to read... perform other tasks
    }
}