0

我们已经完成了一些基本的 TCP 通信,但还有一些问题。我们正在与 TCP 服务器通信,其中事务流描述如下:

发送方通过发送 STX (ASCII 0x02) 字符来启动交易,然后通过发送 ACK (ASCII 0x06) 字符等待接收方回复。收到 ACK 后,发送方发送一个 4 字节无符号大端整数,表示消息有效负载的大小,然后是有效负载,最后是有效负载的 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 传输控制:

4

2 回答 2

2

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

于 2011-01-06T22:34:30.640 回答
2

呵呵,这曾经是一个串口协议,他们可能只是将它原封不动地移动到使用套接字来代替。这并不罕见,尽管它不太适合 TCP 实现的流。

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

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

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

于 2011-01-06T22:38:35.523 回答