Будет ли EAGAIN возвращаться при отправке чего-либо, кроме заполнения буфера? - PullRequest
2 голосов
/ 18 июня 2010

Если я использую send () для неблокирующего сокета tcp в Linux, он вернет EAGAIN для чего-либо, кроме состояния заполнения буфера отправки?

Мне нужно решить, хочу ли я использовать буфер отправки сокета в качестве единственного буфера для моего приложения или мне нужен собственный буфер пространства пользователя для загрузки буфера сокета.

Ответы [ 3 ]

2 голосов
/ 18 июня 2010

Это не должно, но я не понимаю, как это повлияет на ваше решение о буфере пространства пользователя, так или иначе. Либо вам понадобится буфер, либо нет, в зависимости от того, что делает ваше приложение, независимо от конкретной причины получения EAGAIN.

Вы также можете подумать об изменении размера буфера tcp с помощью setsockopt с параметром SO_SNDBUF после выполнения некоторых вычислений, чтобы увидеть, действительно ли это выигрыш в производительности.

1 голос
/ 30 апреля 2015

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 для неблокирующего сокета.

1 голос
/ 20 июня 2010

Если я использую send () для неблокирующего сокета tcp в Linux, он вернет EAGAIN для чего-либо, кроме состояния заполнения буфера отправки?

На неблокирующем сокете это должно быть только условие, так как send () блокирует только когда буфер отправки заполнен.

В противном случае, я бы посоветовал не зависеть от поведения, так как по моему опыту EAGAIN иногда возвращался, когда в ядре что-то не так, но сокет все еще в порядке. Недавно у меня был опыт работы с HP-UX, когда был возвращен EAGAIN, так как ядру явно не хватало памяти. Поскольку ошибка исправима, EAGAIN является приемлемым кодом ошибки для случая.

...