Мы выполнили базовую связь по протоколу TCP, но у вас есть несколько вопросов. Мы связь с сервером TCP, где поток транзакций описываются следующим образом:Отправка/получение сообщений, созданных для последовательной связи через .Net Socket
Отправитель инициирует транзакцию посредством отправки STX (ASCII 0x02) символа, затем ждет получателя , чтобы ответить, отправив ACK (ASCII 0x06) знак. После того, как АСК получен, отправитель передает четыре байт, без знака, тупоконечник целого числа, представляющего размер полезной нагрузки сообщения, за которым следует полезной нагрузки, и, наконец, 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), что такое правильный способ управления контроля передачи/ACK STX? Сокет обрабатывает это автоматически (т. Е. Мы просто вызываем socket.Send (byteData)), или нам нужно явно отправлять STX, ждать ACK и т. Д.?
То же самое касается получения: мы просто получаем входящие данные, или нам нужно прослушивать символ STX, отправлять ACK, готовиться к полезной нагрузке и т. Д.?
Если управление передачей осуществляется автоматически, существуют ли какие-либо конкретные флаги сокетов, которые нам нужно установить?
FYI: Мы нашли несколько ссылок (например, следующее), которые доказали свою полезность для сообщения обрамление, но никто не обсуждать контроль передачи STX/ACK:
- http://blogs.msdn.com/b/joncole/archive/2006/03/20/simple-message-framing-sample-for-tcp-socket.aspx
Мы осуществили этот метод, отправив STX, ожидая, пока мы не получим ACK, отправив длину + полезную нагрузку + MD5, ожидая, пока мы не получим другой ACK, а затем завершим «отправить». Проблема в том, что это синхронный процесс. Это не должно длиться так долго, но возможно, нам, возможно, придется получать подобные данные, ожидая ACK.Каков наилучший подход для этого асинхронно? –
Используйте Socket.BeginReceive(). –
Я знаю, как делать асинхронные сокеты, просто не лучший подход к асинхронному обращению с рукопожатием. Должна ли получаться обратная связь с отправкой на основе полученных данных или есть лучший способ сделать это? Например. Если ACK получен, отправьте следующий элемент в очередь отправки. Если STX получен, отправьте ACK. Если получена полезная нагрузка, отправьте ACK и т. Д. –