sockets - 如何防止接收套接字永远阻塞以防万一它没有接收到任何数据?

标签 sockets networking udp system-calls blocking

在阻塞UDP套接字的情况下,blocking on receive不会接收任何数据,也不会接收任何数据,因为发送者进程由于某种原因而崩溃了。
可以将套接字选项SO_RCVTIMEO设置为确保接收系统调用将返回,但是是否存在“已知方法”来解决该问题(因为超时的值不精确,并且取决于系统是否慢)或不)

最佳答案

您可以使用 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
    }
}

关于sockets - 如何防止接收套接字永远阻塞以防万一它没有接收到任何数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40905134/

相关文章:

c# - 如何在C#中连接到位于本地服务器的数据库

python - 如何使用 scapy 欺骗 UDP 数据包中的 IP 地址

c - 这是处理 UDP 消息的部分读取的正确方法吗?

sockets - 验证多播端口范围

java - 为什么 Java DatagramSocket 没有收到客户端发送的所有 udp 数据包?

linux - 区分Linux网络驱动程序中的转发流量和本地发起的流量

c++ - printf 网络数据

java - 通过 DataOutputStream.writeUTF() 发送信息时出现奇怪的字符

C套接字编程——printf不在屏幕上打印任何东西

c - 将套接字绑定(bind)到 ansi c 中的端口 80