Linux TCP / IP Неблокирующая отправка для потока сокетов .. что происходит с буфером recv TCP?

Это относится к TCP-сокетам ядра Linux 2.6.

Я отправляю большой объем данных, скажем 300 МБ, с неблокирующей отправкой другому клиенту, который получает 8 МБ за раз.

После одного приема 8 МБ «получатель» прекращает прием, потому что он хочет выполнить другие задачи, такие как обработка ошибок. Отправитель получит EWOULDBLOCK, но поскольку это асинхронная связь, отправитель попытается заполнить буфер recv TCP на другом конце.

Мой вопрос: будут ли данные в буфере TCP recv, даже если «отправитель» получил EWOULDBLOCK, а «получатель» перестает получать? Тот же сокет используется для обработки ошибок, поэтому должен ли «получатель» затем очистить буфер TCP recv, прежде чем пытаться повторно использовать существующий сокет?


person user224579    schedule 08.09.2009    source источник


Ответы (2)


да. Вполне возможно (и на самом деле вероятно), что когда вы получите EWOULDBLOCK, некоторые данные, которые вы уже отправили, еще не были прочитаны получающим приложением. Эти буферизованные данные будут доступны следующему read на сокете.

Это означает, что если ваш получатель затем отправляет сообщение «Ой, больше не отправляйте» обратно отправителю, отправитель не может действовать с этим сообщением и «отменить отправку» данных. Как только он был передан _3 _ / _ 4_, он уже в пути и не может быть отозван.

Ваш приемник должен будет справиться с этой возможностью, считывая данные, которые он больше не интересует, и отбрасывая их, что будет означать, что вам понадобятся какие-то разделители транзакций в вашем потоке данных.

person caf    schedule 08.09.2009
comment
Но он заполнит только буфер TCP recv, и будет отправлена ​​только часть из 8 МБ. Так как же узнать, сколько выбросить? - person user224579; 08.09.2009
comment
Вы не узнаете, по крайней мере, насколько вы объяснили, что делаете. Сокеты - это просто потоки данных. Единственное значение, которое они имеют, - это то, что вы им навязываете с точки зрения протокола уровня приложения, записей и т. Д. Если это условие, которое вам нужно учитывать, тогда вам нужно определить что-то, что позволит вам его решить. - person Duck; 08.09.2009
comment
Понятно, это ответственность приложения. Спасибо! - person user224579; 08.09.2009

Мой вопрос: будут ли данные в буфере TCP recv, даже если «отправитель» получил EWOULDBLOCK, а «получатель» перестает получать?

В приемном буфере TCP есть данные, потому что отправитель получил EWOULDBLOCK. Это единственное условие, при котором это может произойти.

Ваш вопрос не имеет смысла.

person user207421    schedule 28.04.2016