通过.Net Socket发送/接收用于串行通信的消息

时间:2011-01-06 22:12:27

标签: c# .net sockets tcp stx

我们已经完成了一些基本的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传输控制:

2 个答案:

答案 0 :(得分:2)

TCP不了解您的应用程序级协议。 TCP套接字只是一个双向字节流。您必须明确发送/读取STXACK个字节。

答案 1 :(得分:2)

呵呵,这曾经是一个串口协议,他们可能只是将它改变为使用套接字而不是。虽然它不太适合像TCP实现这样的流,但并不罕见。

好吧,按照说明操作。假设您是客户端,请读取一个字节并验证其是0x02。如果是,则发回一个字节0x06。如果没有,请继续阅读,直至看到0x02。你现在已经“联系”了,但你已经知道了。

接下来,读取4个字节,因此您知道数据包长度,读取多个字节+ 2以获取数据包的其余部分。我忽略了'MD5摘要',TCP足够可靠,不必仔细检查接收数据的有效性。发回一个字节,0x06。

唯一不清楚的是你是否应该在数据包长度之前预期0x02。文字说你没有,图表说你做了。