Я пишу клиент-серверное приложение (TCP-протокол) на C++.
У меня есть возможность, когда клиент может получать данные с нескольких серверов.
Чтобы решить эту проблему, я создал список соединений сокетов.Оптимизированный процесс приема пакетов данных при большой нагрузке на сеть
В цикле, на каждую розетке, я выполняю следующие действия:
- попытки получить данные об этом на гнездо
- поместить это в буфере
- буфер данных процесса
- ясно буфер
- выполняют те же шаги для следующего гнезда
Сейчас в мой дизайн, изначально я создал общий буфер для всех подключений. Но я предполагаю, что в случае большой нагрузки на сеть может случиться так, что полученная телеграмма не является полной телеграммой, она может быть частью телеграммы. поэтому, чтобы завершить телеграмму, мне придется ждать следующей итерации для того же сокета, и даже клубы или идентификационные телеграммы будут сложным процессом.
Для обработки этого сценария одним из решений может быть предоставление выделенного буфера для каждого соединения.
Можно ли предложить более оптимизированное/лучшее решение, чтобы избежать создания выделенного буфера для каждого соединения?
Взгляните на Boost Asio http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio.html, чтобы вам не пришлось изобретать колесо. В общем смысле, хотя, если вам нужно удержать экземпляры частичных данных, для этого вам нужен буфер. Также обратите внимание, что сетевой стек будет хранить данные TCP для вас, поэтому в зависимости от ваших точных требований, которые могут быть достаточно хорошими. –
Проблема «не получения полной телеграммы» не уникальна для тяжелых нагрузок. У вас будет эта проблема и при легких нагрузках. Потоки сокетов TCP все время получают частичные данные - это характер TCP (через сегментацию, фрагментацию, отрыжки в сети и т. Д.).В любом случае, вы всегда будете хотеть зацикливаться на каждом сокете, пока не получите полное сообщение. – selbie
@selbie: отличная точка, и одинаково: если вы отправляете два сообщения, они могут быть получены одним вызовом 'recv' или' read'. В конечном счете, TCP является протоколом * байтового потока * с контролем потока, и вы должны быть готовы к блокировке и/или частичным передачам и частичным/объединенным приемам. –