EAGAIN / EWOULDBLOCK также можно вернуть (для сокетов TCP), когда число неподтвержденных пакетов достигло окна перегрузки.
Для проверки состояния розетки w.r.t. окно перегрузки, затем попробуйте это:
#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 для неблокирующего сокета.