套接字recv(阻塞)因errno EAGAIN而失败 - 资源暂时不可用

时间:2017-06-26 20:52:32

标签: sockets unix ipc blocking recv

我正在实现UNIX域套接字Inter Process通信代码,我随机地发现了这个错误 - "错误11:资源暂时不可用"在尝试从套接字读取时。我使用MSG_PEEK读取套接字中的字节数,并为接收缓冲区分配字节,并读取实际数据。

套接字是一个阻塞套接字,我没有任何代码可以进行非阻塞(总之,接受/读/写)。什么可能导致阻塞套接字读取的指针?从MSG_PEEK的man page开始,当使用O_NONBLOCK将套接字标记为非阻塞时,似乎可以返回EAGAIN。

失败发生在下面的recv调用中。

        char temp_buffer[BUFFER_MAX];
        num_bytes = recv(_connection_fd, &temp_buffer, BUFFER_SIZE_MAX, MSG_PEEK | MSG_TRUNC);
        if (num_bytes < 0) {
            LogError("Error reading from socket. %s", strerror(errno));
            close(_connection_fd);
            return -1;
        }
        .....
        <Allocate memory>
        .....
        // Read actual data
        num_bytes = read(_connection_fd, buffer, num_bytes);
        ...
        <Send response back to client>
        <Close socket descriptor>

1 个答案:

答案 0 :(得分:1)

如果套接字已设置超时SO_RCVTIMEO选项(默认为0),则可能还会阻塞套接字并阻塞recv。顺便说一下,你在recv()之前考虑过select()吗?