У меня нет прямого опыта работы с TCP в Go, но мне кажется, что вы стали жертвой довольно типичного недопонимания того, что гарантирует TCP.
Дело в том, что, в отличие, скажем, от UDP и SCTP , TCP не имеет концепции границ сообщений, потому что он ориентирован на поток. Это означает, что TCP транспортирует непрозрачные потоки байтов, и у вас очень мало контроля над «разбиением» этого потока по отношению к принимающей стороне.
Я подозреваю, что «отправка сообщения 100k +» - это библиотека времени выполнения / сети на стороне отправителя, которая обычно «обманывает» вас, загружая ваше «сообщение» во внутренние буферы и затем направляя его в любой стек TCP стека ОС. позволяет это сделать (на вездесущем оборудовании / программном обеспечении это обычно около 8 КБ). Размер кусков, которые получатель получает, этот поток полностью не определен; единственное, что определено, это порядок байтов в потоке, который сохраняется.
Следовательно, может оказаться, что вам придется пересмотреть свой подход к получению данных. Точный подход варьируется в зависимости от характера передаваемых данных:
- Самый простой способ (если у вас есть контроль над протоколом уровня приложения) - передать длину следующей «полезной нагрузки сообщения» в специальном поле длины фиксированного формата. Затем уничтожение всего сообщения является двухэтапным процессом: 1) получить столько байтов, чтобы получить поле длины, прочитать его, проверить значение для здравомыслия, затем 2) прочитать много следующих байтов и покончить с этим.
- Если у вас нет контроля над протоколом уровня приложения, анализ сообщений становится более сложным и обычно требует какого-то сложного конечного автомата.
Для получения дополнительной информации посмотрите это и это .