当前位置: 首页 > 知识库问答 >
问题:

套接字recv(阻塞)失败,errno eAgain--资源暂时不可用

蔚元明
2023-03-14

我正在实现一个UNIX域套接字进程间通信代码,在试图从套接字读取时,我随机地碰到了这个错误--“errno 11:资源暂时不可用”。我使用MSG_PEEK从套接字读取字节数,并为接收缓冲区分配字节数,并读取实际数据。

套接字是一个阻塞套接字,我没有任何非阻塞的代码(总之,接受/读/写)。在阻塞套接字读取中,有什么可能导致这种情况的指针吗?在MSG_PEEK的手册页中,当socket标记为非阻塞时,似乎可以使用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个答案

令狐和裕
2023-03-14

如果socket设置了timeout SO_RCVTIMEO选项(默认值为0),阻塞socket和阻塞recv也可能发生这种情况。顺便说一句,您在recv()之前考虑过select()吗?

 类似资料:
  • 创建套接字 使其非阻塞 呼叫连接 按预期返回-1和errno EINPROGRESS 调用select 返回>0,因此已建立连接 再次阻塞套接字 此部件的代码如下: 那还行。但是我有一个循环,在这个循环中我调用了一个函数,该函数检查是否收到了要读取的新数据包:

  • 我使用tcpdump从客户端捕获数据包,每个数据包都是分段到最大1448字节的数据,但是head只有5字节,为什么我可以成功读取head,但是下面的data recv()操作又会返回ee?当数据已经到达recv缓冲区时,recv是否可能返回EAGAIN?在我看来,我可以读取前5个字节,所以必须有更多的数据在recv缓冲区读取。 可能与TCP/IP协议栈中的组装过程有关。代码如下所示,每个pdu r

  • 特定的代码包括手动打开套接字连接,并通过临时将套接字设置为非阻塞来实现超时,移动到Connect方法,轮询套接字直到它连接,但还包括用于超时的退出路径。 当传递非阻塞连接方法时,会引发一个异常,该异常表示“如果我是阻塞套接字,我会在这里阻塞”(在技术上称为“eAgain”,字符串“resource permental unavailable”被绑定)。我捕捉到该异常,如果它是“wouldblock

  • 另外,除了调用recv函数后检查WSAGetLastError的值之外,是否还有其他方法可以使用TCP套接字库检测网络断开? 多谢!

  • 我想用pywebkitgtk捕获网页。我已经在那台机器上安装了X org服务器,除了一些例外情况外,还启动了X服务器,但是X服务器正在运行。问题是我不能从X unix套接字中读取任何数据,它是path=@“/tmp/.x11-unix/x0”的PF_FILE类型,recvfrom正在抛出EAGAIN(资源暂时不可用)错误,对该套接字的轮询经常超时,没有任何数据,下面是跟踪日志,在其中我们可以找到成