У меня есть 2 службы, которые обмениваются данными через TCP-сокет (тот, который инициирует соединение, является службой Windows C ++, а получатель — потоком C # TCP) и (скажем, они могут не использовать одно и то же TCP-соединение все время ). Иногда я получаю половину сообщений (где число байтов так или иначе просчитывается) при большой загрузке сети.
У меня есть несколько вопросов, чтобы решить эту проблему:
Могу ли я быть уверен, что сообщения (а не пакеты …) должны следовать друг за другом, например, если я отправлю сообщение 1 (полученное как половина), а затем сообщение 2, могу ли я быть уверен, что следующая половина сообщения 1 выиграла не будет после сообщения 2?
У вас должен быть отдельный ответ для одного и того же TCP-соединения между всеми сообщениями, если между ними нет одинакового TCP-соединения.
Есть ли разница, находятся ли отправитель и получатель на одной станции?
TCP — это потоковый протокол, который доставляет поток байтов. Он не знает (или не заботится) о границах ваших сообщений.
Для отправки данных TCP разбивает поток на пакеты произвольного размера. [это не совсем произвольно и действительно сложно.] и надежно отправить их на другой конец.
Когда вы читаете данные из сокета TCP, вы получаете те данные, которые 1) поступили и 2) поместятся в предоставленный вами буфер.
На приемной стороне вам нужно использовать код для повторной сборки полных сообщений из потока TCP. Возможно, вам придется написать это самостоятельно, или вы обнаружите, что она уже написана для вас любой библиотекой (если таковая имеется), которую вы используете для взаимодействия с сокетом.
TCP является потоковый протокол, он не имеет «сообщений» или «пакетов» или других границ. Иногда, когда вы получаете данные, вы можете не получить все, что было отправлено, в других случаях вы можете получить более одного «сообщения» в полученном потоке.
Вы должны смоделировать свой протокол для обработки этих вещей, например, путем включения специальных терминаторов сообщений или включения заголовка фиксированного размера, включая размер данных.
Если вы не получаете все сообщения одновременно, то вам придется получать снова, возможно, даже несколько раз, чтобы получить все отправленные данные.
А чтобы ответить на ваш вопрос, вы можете быть уверены, что поток получен в том порядке, в котором он был отправлен, или уровень TCP выдаст вам ошибку. Если байт A был отправлен до байта B, то он гарантированно прибудет в этом порядке. Также нет теоретической разницы, если отправитель и получатель находятся в одной системе или на разных континентах.