Как получить размер окна tcp сокета в Linux? - PullRequest
0 голосов
/ 07 января 2019

Есть ли способ в linux c api, чтобы получить размер входящего окна вашего сокета tcp?

Чтобы было ясно, под входящим я имею в виду мой сервер Linux. Кажется, что значения SND и RCV в linux в моем принятом сокете перевернуты, то есть RCV означает от сервера к клиенту. В этом случае мне нужен клиент на стороне сервера, который является SND.

SND_BUF и RCV_BUF кажутся не связанными с фактическим значением, которое отправлено, и TCP_WINDOW_CLAMP не является точным.

1 Ответ

0 голосов
/ 07 января 2019

Внутренние параметры сокета tcp можно прочитать с помощью этой (специфичной для linux, непереносимой) опции сокета:

struct tcp_info ti;
socklen_t tisize = sizeof(ti);
getsockopt(fd, IPPROTO_TCP, TCP_INFO, &ti, &tisize);

Структура tcp_info определена в linux/tcp.h, а ее член ti.tcpi_rcv_space содержит объявленное окно приема tcp для соответствующего сокета.

Начиная с Linux 4.8, появилась новая опция сокета tcp TCP_REPAIR_WINDOW, которая позволяет читать (и даже устанавливать) окно отправки и получения напрямую:

struct tcp_repair_window trw;
socklen_t trwsize = sizeof(trw);
getsockopt(fd, IPPROTO_TCP, TCP_REPAIR_WINDOW, &trw, &trwsize);

Теперь окно отправки и получения TCP можно прочитать из trw.snd_wnd и trw.rcv_wnd.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...