Отправка / прием сообщений в обрамлении для последовательной связи над розеткой .NET

StackOverflow https://stackoverflow.com/questions/4620500

  •  30-09-2019
  •  | 
  •  

Вопрос

Мы сделали базовую связь TCP, но есть несколько вопросов. Мы связываемся с TCP-сервером, в котором поток транзакции описывается следующим образом:

Отправитель инициирует транзакцию, отправив символ STX (ASCII 0x02), затем ждет получателя, чтобы ответить, отправив символ ACK (ASCII 0x06). После получения ACK отправитель передает четырехбайтовое, беззнаковочное, большое целое число, представляющее размер полезной нагрузки сообщений, за которым следует полезная нагрузка, и, наконец, перезапись обновления 16-байта MD5 для полезной нагрузки. Если получатель удовлетворен сообщением, он отправляет персонаж ACK.

<STX> = ASCII 0x02
<ACK> = ASCII 0x06

Sender: <STX>     <0x00><0x00><0x00><0x05><'H'><'E'><'L'><'L'><'O'><0xEB><0x61>...
Recipient:   <ACK>                                                                <ACK>

Используя сокеты .NET (System.net.sockets.socket), какой правильный способ управлять управлением передачи STX / ACK? Обрабатывает ли сокета это автоматически (т.е. мы просто называем Socket.send (bytedata)), или нам нужно явно отправить STX, дождитесь ACK и т. Д.

То же самое касается приема: просто мы получаем входящие данные, или нам нужно слушать символ STX, отправить ACK, подготовиться к полезной нагрузке и т. Д.?

Если управление передачей обрабатывается автоматически, есть ли какие-либо конкретные флаги сокетов, которые нам нужно установить?

FYI: Мы нашли несколько ссылок (например, следующие), которые оказались полезными для обрамления сообщений, но никто не обсуждает управление передачей STX / ACK:

Это было полезно?

Решение

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

Ну, следуйте инструкциям. Предполагая, что вы являетесь клиентом, прочитайте один байт и проверяете его 0x02. Если оно есть, отправьте обратно один байт, 0x06. Если нет, продолжайте читать, пока не увидите 0x02. Вы сейчас «связаны», но вы уже знали это.

Далее прочитайте 4 байта, чтобы вы знаете длину пакета, читайте как можно больше байтов + 2, чтобы получить остальную часть пакета. Я бы проигнорировал «Digest MD5», TCP достаточно надежен, чтобы не иметь двойной проверки достоверности полученных данных. Отправьте один байт, 0x06.

Единственное, что не является ясно, - это ли вы ожидаете, что вы ожидаете 0x02 до длины пакета или нет. Текст говорит, что вы этого не сделаете, диаграмма говорит, что вы делаете.

Другие советы

TCP не знает о вашем протоколе уровня приложения. Разъем TCP - это просто двунаправленный байтовый поток. Вы должны явно отправлять / читать те STX а также ACK Байты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top