EAGAIN是否会返回缓冲区已满以外的任何内容?

如果我在Linux中的非阻塞tcp套接字上使用send(),它将返回EAGAIN用于发送缓冲区满状态以外的其他任何东西?

我基本上需要决定是否要使用套接字发送缓冲区作为我的应用程序的唯一缓冲区,或者如果我需要我自己的用户空间缓冲区来提供套接字缓冲区。

它不应该,但我不知道这是如何影响你的决定用户空间缓冲这样或那样。 无论您是否需要缓冲区,取决于您的应用程序在做什么,无论获取EAGAIN的具体原因如何。

你也可以考虑使用SO_SNDBUF选项,用setsockopt改变tcp缓冲区的大小,然后进行一些计算,看看它是否是一个性能优势。

EAGAIN / EWOULDBLOCK也可以返回(对于TCP套接字)当未确认的数据包的数量已经到达拥塞窗口。

要检查拥塞窗口的套接字状态,请尝试以下操作:

#include <netinet/tcp.h> static void print_tcp_cwnd(int socket) { struct tcp_info tcp_info; uint tcp_info_length = sizeof(tcp_info); if ( getsockopt( socket, SOL_TCP, TCP_INFO, (void *)&tcp_info, &tcp_info_length ) == 0 ) { printf("tcpi_snd_cwnd: %u, tcpi_unacked: %u\n", tcp_info.tcpi_snd_cwnd, tcp_info.tcpi_unacked ); } } 

如果tcpi_unacked == tcpi_snd_cwnd则send()将返回EAGAIN / EWOULDBLOCK作为非阻塞套接字。

如果我在Linux中的非阻塞tcp套接字上使用send(),它将返回EAGAIN用于发送缓冲区满状态以外的其他任何东西?

在只有条件的非阻塞套接字上,因为send()只在发送缓冲区已满时阻塞。

否则,我建议不要依赖于我的经验,EAGAIN有时在内核中的某些次要失败时返回,但socket仍然可以。 在EAGAIN被返回后,我最近在HP-UX上获得了经验,因为显然内核内存不足。 由于错误是可恢复的,EAGAIN是可接受的错误代码的情况下。