2017-02-02 12 views
0

Я прочитал How large should my recv buffer be when calling recv in the socket library, чтобы понять буфер в read. Есть еще некоторые моменты, которые я хочу знать о буфере чтения в подключении сокета tcp. Мое приложение отправляет видеопакеты. когда я устанавливаю бафф в 80000, отправитель может отправлять пакеты, но когда я установил его меньше, например, 8000 после отправки нескольких пакетов, он останавливается с RST.читать бафф в гнезде tcp

a) Этот буфер, окно приема TCP? b) Есть ли какая-либо связь между этим буфером и .net.ipv4.tcp_rmem, .net.ipv4.tcp_wmem? Если да, должен ли я устанавливать буфер чтения на основе rmem или wmem?

я бы очень признателен за любые ответы

+0

(a) Нет, в коде, указанном в вашей ссылке, это буфер приложения, массив символов. Если это не то, о чем вы говорите, это зависит от вас, чтобы уточнить. (b) Нет. Если вы получили сброс, просто изменив размер буфера, что-то не так с вашим кодом. Трудно понять, почему вы уменьшили размер буфера, какой бы буфер вы ни говорили. Еще лучше. – EJP

+0

Спасибо за ваш ответ. Я получил то, что теперь делает бафф. Я напишу новый вопрос о том, как решить проблему RST в моем коде. –

ответ

0

а) Является ли этот буфер, TCP окна приема?

Нет, это всего лишь буфер, который вы предоставляете стеку TCP для размещения байтов при вызове recv().

б) Есть ли связь между этим буфером и .net.ipv4.tcp_rmem, .net.ipv4.tcp_wmem?

No.

если да, Должен ли я установить буфер считывания на основе rmem или женщин?

Вы можете передать любой буфер размера, который вы хотите вернуть(); он не связан ни с одним из вышеперечисленных, за исключением того, что нет никакой выгоды сделать буфер, который вы передаете recv() больше, чем текущий размер SO_RCVBUF сокета, так как маловероятно, что recv() будет возвращать больше байт одновременно может присутствовать во внутреннем буфере сокета.

Как решить, какой размер буфера использовать - считайте, что больший буфер (конечно) занимает больше памяти, а если вы выделяете этот буфер в стеке, очень большой буфер может вызвать стек переполнение. С другой стороны, меньший буфер означает, что вы можете читать меньше байтов с любым заданным вызовом recv(), поэтому вам может потребоваться повторно вызвать recv() для чтения в том же общем количестве байтов.

Обратите внимание, что количество байтов данных, возвращаемых recv(), может быть любым числом от 1 байт до общего размера буфера, который вы передали в третий аргумент recv(), и нет способа предскажите, сколько байтов вы получите. В частности, с TCP количество байтов, которое вы получаете от какого-либо конкретного вызова recv(), будет , а не, имеют какую-либо корреляцию с количеством ранее переданных байтов на любой конкретный вызов send() на стороне отправки. Таким образом, вам просто нужно использовать массив «разумного размера» (для любого определения «разумного размера», которое вы предпочитаете) и recv() как можно больше байтов, а затем обрабатывать так много байтов (на основе recv() возвращаемое значение).

+0

Перейдите по ссылке. «Этот буфер» - это массив символов на стороне приложения, а не буфер приема сокета TCP. – EJP

+0

А, так оно и есть. Я обновил свой ответ, спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^