Не волнуйтесь, вы из единственного, кто имеет эту проблему. Определенно есть решение. На самом деле, у вас TWO проблем с устаревшим протоколом, а не только с одним.
Ваш старый унаследованный протокол требует, чтобы одно «прикладное сообщение» вписывалось в «один и только один TCP-пакет» (поскольку он неправильно использует TCP-ориентированный протокол в качестве пакетно-ориентированного протокола). Поэтому мы должны убедиться, что:
- нет "сообщения приложения", разбитого на несколько пакетов TCP (проблема, которую вы видите)
- ни один TCP-пакет не содержит более одного "сообщения приложения" (вы этого не видите, но это может произойти)
Решение:
задача 1
Вы должны заполнить свой сокет всеми вашими данными "сообщения" сразу. В настоящее время этого не происходит, потому что, как об этом говорили другие люди, API-интерфейс потока потоков, который вы используете, помещает данные в сокет в виде отдельных вызовов, когда вы используете последовательное «<<», а базовый стек TCP / IP вашей ОС не буферизуется. этого достаточно (и с причинами для лучшей производительности) </p>
Несколько решений:
- вы передаете буфер символов вместо отдельных символов, так что вы делаете только один вызов << </li>
- вы забываете о boost, открываете сокет ОС и передаете его одним вызовом send () (в windows ищите API «winsock2» или «sys / socket.h» в unix / cygwin)
задача 2
Вы ДОЛЖНЫ активировать опцию TCP_NODELAY в своем сокете. Эта опция специально сделана для таких устаревших протоколов. Это гарантирует, что стек ОС TCP / IP отправляет ваши данные «без задержки» и не буферизует их вместе с другим приложением, которое вы можете отправить позже.
- если вы используете Boost, ищите опцию TCP_NODELAY, она есть в документе
- если вы используете сокеты ОС, вам придется использовать функцию setsockopt () в вашем сокете.
Заключение
Если вы решите эти две проблемы, у вас все будет хорошо!
API для сокетов ОС в Windows или Linux немного сложен в использовании, но вы получите полный контроль над его поведением. Пример Unix