2010-08-25 74 views
0

我有一個發件人,一個消息轉發器,它以每個消息5毫秒的速率發送固定大小的字節數據到我用vb6編寫的接收程序,當我運行消息fowarder和我的接收程序在一臺機器上,沒有問題,但是當它們在單獨的機器上運行時,接收程序開始出現一些異常情況。服務器無法在vb6中順利接收字節數據

例如:

private sub socket_DataArrival(index as integer, ByVal dataTotal as Long) 

Dim Data() as Byte 
Length.Text = dataTotal 

socket.GetData byteData, vbArray + vbByte 

If Length.Text = "100" Then 
txtOutput.Text = "Message1" 

ElseIf Length.Text = "150" Then 
txtOutput.text = "Message2" 

End Sub 

在它有250個字節或當我應該接收100或只有150,但如果非recognizeable字節大小我有時會收到「2合1」的消息我將發送速率降低到每個消息50毫秒的更慢的速度,那麼它會沒事的。

可以有什麼建議嗎?謝謝。

回答

0

當過你必須習慣這樣的事實,數據包可以到達的順序一個網絡發送數據,不及時,一點都沒有,等

你需要提高你的消息協議,包括一個標題指出了哪種類型的消息。如果順序很重要,包括一個序列號(我假設你使用的是UDP)。目前,您正在依靠計時來分離郵件,而這些郵件在網絡上無法使用。

緩衝所有到達的數據並以塊處理 - 頭允許您指出要使用的塊大小。將輸入緩衝區與消息處理分開 - 使用DataArrival事件將數據添加到緩衝區,使用Timer或其他方式輪詢緩衝區以檢查是否有消息可供分析。唉,這是VB6,所以線程並不那麼容易。看看The Common Controls Replacement Project計時器對象DLL,如果您需要一個不依賴於UI元素存在的Timer類。

+0

TCP數據將按順序到達。在「消息」之後,也可以使用分隔符代替標頭。但是我看不出任何類型的定時器的任何理由。在DataArrival中,您只需將新數據附加到緩衝區,然後解析並處理任何完整的消息。 – Bob77 2010-08-25 17:52:39

+0

感謝您的建議,我使用TCP進行數據傳輸,我不確定是否可以使用分隔符,因爲傳入的字節不是字符串消息,而是稍後將相應地移出字節的數組的字節。從上面的例子來看,如果我收到250字節,可能有辦法分割它,但有時它會以一些不規則的大小,如180 ...等等。如果我錯了,請糾正我。謝謝。 – k80sg 2010-08-26 02:36:14

+0

對於二進制數據,你非常想要一個長度標題,正如上面已經提到的那樣。 – Bob77 2010-08-28 02:05:30

相關問題