Программирование сокетов C++ Максимальный размер буфера сокета TCP/IP?

Я использую сокеты C++ TCP/IP. Согласно моим требованиям, мой клиент должен подключиться к серверу и прочитать сообщения, отправленные им (это что-то действительно новое, не так ли), но... в моем приложении мне нужно подождать некоторое время (обычно 1-2 часа). ) до того, как я действительно начну читать сообщения (через recv() или read()), а сервер все еще продолжает отправлять сообщения.

Я хочу знать, есть ли ограничение на емкость буфера, в котором хранятся эти сообщения на случай, если они не будут прочитаны, и чья физическая память используется для буферизации этих сообщений? Отправителя или получателя?


person Rampal Chaudhary    schedule 17.10.2012    source источник
comment
comment
Это кажется глупым требованием. Поток TCP вполне может блокироваться на сервере, когда буферное пространство на клиенте заполняется. Затем буферное пространство сервера будет заполнено неотправленными сообщениями, что повлияет на других клиентов. Можете ли вы дать более подробную информацию? Не можете ли вы буферизовать сообщения в пользовательском пространстве клиента и обрабатывать их по истечении времени ожидания?   -  person Martin James    schedule 17.10.2012


Ответы (1)


Данные TCP буферизуются как у отправителя, так и у получателя. Размер приемного буфера сокета получателя определяет, сколько данных может быть отправлено без подтверждения, а размер буфера отправки отправителя определяет, сколько данных может быть отправлено до того, как отправитель заблокирует или получит EAGAIN/EWOULDBLOCK, в зависимости от блокировки/неблокировки. режим блокировки. Вы можете установить размер этих буферов сокета сколь угодно большим, вплоть до 2^32-1 байт, но если вы установите размер буфера приема клиента больше, чем 2^16-1, вы должны сделать это до подключения сокета, чтобы масштабирование окна TCP могло быть выполнено. согласовываться при рукопожатии соединения, так что старшие 16 бит могут вступить в игру. [Буфер приема сервера здесь не имеет значения, но если вы установите его >= 64 КБ, вам нужно установить его в сокете прослушивания, откуда он будет унаследован принятыми сокетами, опять же, чтобы рукопожатие могло согласовать масштабирование окна.]

Однако я полностью согласен с Мартином Джеймсом в том, что это глупое требование. Он тратит впустую поток, стек потоков, сокет, большой буфер отправки сокета, FD и все другие связанные ресурсы на сервере в течение двух часов и, возможно, влияет на другие потоки и, следовательно, на других клиентов. Это также ложно создает у сервера впечатление, что данные за два часа были получены, хотя на самом деле они были переданы только в приемный буфер, что может привести к неизвестным осложнениям в ситуациях восстановления: например, сервер может быть не в состоянии восстановить данные, отправленные так далеко вперед. Вам лучше не подключаться, пока вы не будете готовы начать получать данные, или же читать и буферизовать данные себе на клиенте для последующей обработки.

person user207421    schedule 17.10.2012