2010-05-24 54 views
1

C#套接字服務器,其中有大約200-500個活動連接,每個連續不斷地發送消息到我們的服務器。SocketAsyncEventArgs和緩衝消息在部分

約70%的消息的處理罰款(以正確的順序等)的時間,但是在案件的其他30%我們錯雜消息和事情被搞砸了。我們應該注意到有些客戶端使用unicode發送數據,而其他客戶端使用ASCII發送數據,因此也可以處理。發送到服務器

消息是一個可變長度的字符串,其端部是CHAR3,那就是我們打破我們繼續接收數據的CHAR3,比其他。

誰能有何啓示我們ProcessReceive代碼,看看什麼可能會造成我們的問題,我們如何解決這個小問題(這裏的希望這是一個小問題!)

下面

代碼:

+0

代碼在這裏:http://95.131.67.163/code.txt – Rob 2010-05-24 13:46:23

回答

1

首先,我相信你知道,但總是值得重複; TCP是一個字節流。它不知道你可能確定存在於該字節流中的任何應用程序級別的「消息」。所有成功的套接字Recv調用(無論是同步還是異步)都可以返回1和所提供緩衝區大小之間的任意數量的字節。

考慮到這一點,你真的應該處理的消息幀(即尋找你的分隔符),你做任何事情之前。如果您沒有找到分隔符,那麼只需使用相同的緩衝區並使用相同的緩衝區並將偏移量設置爲您當前所在的位置來重新發出讀取數據,這將讀取更多數據到緩衝區,並且您可以再次查看分隔符下一次讀取已完成......理想情況下你會防不勝防,你終於趕到了此緩衝區尋找一個分隔符時減少重複掃描...

現在你不這樣做,你的使用e.Buffer[e.Offset] == 255將失敗,如果您收到一條消息到達,因爲您可能指的是消息中的任何字節,如果消息被拆分爲多個讀取。

+0

e.Buffer [e.Offset] = 255純粹是爲了規定客戶端是否運行unicode客戶端,我們只關心255作爲客戶端發送的第一條消息,然後我們在狀態對象中設置isUnicode並從那時起使用它。 分隔符是我們在將內容附加到狀態sb字符串後檢查的第一件事(char3)。這有點奇怪,因爲80%的時間它的工作沒有問題,但是當我們註銷我們的錯誤時,我們發現char3被找到,但字符串從一開始就不完整。這是沒有意義的部分 – Rob 2010-05-24 17:18:22

+0

事實上,似乎一堆問號被預先附加到大部分消息。聽起來像一個unicode錯誤,但不知道發生在哪裏 – Rob 2010-05-24 17:21:47

+0

例如:???????????????????????????????????????????? 3mat88jonmatxxx2.19d99e0d54a6e18d00c105200e7175308bf6aa17e是搞砸了的消息,應該只是: 3mat88jonmatxxx2.19d99e0d54a6e18d00c105200e7175308bf6aa17e – Rob 2010-05-24 17:24:14

0

我看到的問題是,您所呼叫Encoding.Unicode.GetString()您在當前讀取從插座接收緩衝區。但是,該緩衝區的內容可能不是字符串的有效Unicode編碼。

你需要做的是緩衝你的整個流,然後在一個最終的操作來解碼爲一個字符串,已收到所有數據後。