我们已经完成了一些基本的TCP通信,但有一些问题。我们正在与TCP服务器通信,其中事务流程描述如下:
发件人启动交易 通过发送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),管理STX / ACK传输控制的正确方法是什么?套接字是否自动处理(即我们只是调用socket.Send(byteData)),还是需要显式发送STX,等待ACK等?
接收也是如此:我们只是接收传入的数据,还是我们需要监听STX字符,发送ACK,准备有效负载等等?
如果自动处理传输控制,是否需要设置任何特定的套接字标志?
仅供参考:我们发现几个链接(如下所示)已证明对消息帧有用,但没有一个讨论STX / ACK传输控制:
答案 0 :(得分:2)
TCP不了解您的应用程序级协议。 TCP套接字只是一个双向字节流。您必须明确发送/读取STX
和ACK
个字节。
答案 1 :(得分:2)
呵呵,这曾经是一个串口协议,他们可能只是将它改变为使用套接字而不是。虽然它不太适合像TCP实现这样的流,但并不罕见。
好吧,按照说明操作。假设您是客户端,请读取一个字节并验证其是0x02。如果是,则发回一个字节0x06。如果没有,请继续阅读,直至看到0x02。你现在已经“联系”了,但你已经知道了。
接下来,读取4个字节,因此您知道数据包长度,读取多个字节+ 2以获取数据包的其余部分。我忽略了'MD5摘要',TCP足够可靠,不必仔细检查接收数据的有效性。发回一个字节,0x06。
唯一不清楚的是你是否应该在数据包长度之前预期0x02。文字说你没有,图表说你做了。