2011-01-06 97 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字節。