首页 文章

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

提问于
浏览
0

我正在实现一个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 回答

  • 1

    如果套接字具有超时SO_RCVTIMEO选项设置(默认为0),它也可能发生阻塞套接字和阻塞recv . 顺便说一下,你在recv()之前考虑过select()吗?

相关问题