Структурирование TCP-сообщений для правильной передачи данных - PullRequest
0 голосов
/ 10 июня 2018

Я пишу программу на C # с сервером, который передает данные между несколькими клиентами.Прямо сейчас, когда мне нужно отправить данные, я отправляю 4 байта данных длины и длины, и всякий раз, когда есть данные, доступные для чтения на принимающей стороне, он считывает первые 4 байта как длину и считывает количество байтов длины какданные.

Мне было интересно, может ли быть ситуация, когда несколько байтов могут быть как-то пропущены, и тогда я застряну, пытаясь прочитать миллиарды байтов несуществующих данных, потому что я читаю неправильные байты какдлина.

Я думал об использовании, скажем, уникальной строки, и всякий раз, когда эта строка читается, после этого читается 4 байта длины, затем какая-то контрольная сумма, а затем 4 байта случайного идентификатора,и затем длина количества байтов считывается.Если эти байты не проходят контрольную сумму или в ней найдена уникальная строка, то сообщение отбрасывается и отправляется запрос на повторную отправку сообщения по его идентификатору, и следующее сообщение будет получено, начиная со следующего вхожденияуникальная строка.

Достаточно ли хорош этот метод или я должен сделать это другим способом?

1 Ответ

0 голосов
/ 11 июня 2018

TCP - это так называемый протокол транспортного уровня .Вы можете прочитать удобный учебник о том, что дает вам здесь .

Это, в свою очередь, означает, что все передаваемые вами данные будут надежно получены в том же порядке, в котором они были отправлены.Если что-либо будет утеряно или повреждено при передаче, TCP отправит его повторно.Все это происходит под одеялом, и вам не нужно об этом беспокоиться.Он также управляет управлением потоком.

Единственное, что вы должны сделать, - это неожиданно обработать разрыв соединения.Помимо этого (или, может быть, вы уже делаете это) подход, который у вас есть, в порядке, хотя традиционно выводить эти байты длины в провод в так называемом порядке сетевых байтов, который является байтовым порядком байтов.Я не знаю, как бы вы сделали это в C #, но подпрограммы C, которые поддерживают это, описаны здесь .Но за то, что вы делаете, вам, вероятно, не нужно беспокоиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...