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