Отправка / получение сообщений для последовательной связи через .Net Socket - PullRequest
0 голосов
/ 07 января 2011

Мы выполнили некоторые основные действия по 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 и т. Д .?

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

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

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

Ответы [ 2 ]

2 голосов
/ 07 января 2011

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

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

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

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

2 голосов
/ 07 января 2011

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

...