2011-01-06 62 views
0

我们已经完成了一些基本的TCP通信,但有几个问题。我们正在与其中的交易流程被描述为TCP服务器通信如下:通过.Net发送/接收为串行通信构造的消息套接字

发送方通过发送STX(ASCII 0×02) 字符发起交易 ,然后等待 接收者通过发送回复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等?

接收也是一样:我们是简单地接收传入的数据,还是需要监听STX字符,发送ACK,准备好有效载荷等?

如果传输控制是自动处理的,是否有我们需要设置的特定套接字标志?

FYI:我们发现,已经证明了消息框有用的几个环节(如以下),但没有讨论STX/ACK传输控制:

回答

2

嘿嘿,这曾经是一个串口协议,他们可能只是把它改为使用套接字来代替。并不罕见,尽管它不太适合像TCP工具这样的流。

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

接下来,读取4个字节,以便您知道数据包长度,读取尽可能多的字节数+ 2以获取数据包的其余部分。我会忽略'MD5摘要',TCP足够可靠,无需再次检查接收数据的有效性。发回一个字节,0x06。

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

+0

我们实现了这个方法,发送STX,等到我们收到ACK,发送长度+ payload + MD5,等到我们收到另一个ACK,然后完成“send”。问题在于它处于同步过程中。它需要很长时间才能完成,但可能需要在等待ACK时收到类似的数据。异步执行此操作的最佳方法是什么? – 2011-01-11 20:47:22

2

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