我編程使用異步套接字(使用BeginSend,EndSend,BeginReceive,EndReceive)彼此之間發送數據的應用程序。 IPV4上的套接字是TCP,沒有套接字標誌。
它使用系統發送一個4字節(int)消息,然後是一個消息,其長度在前一條消息中指定。我使用處理MessageLength和MessageBody的函數助手。流程是這樣的
- BeginReceive()
- EndReceive()
- MessageLengthReceived()
- BeginReceive()
- MessageBodyReceived()
問題:
當我發送文件數據時,問題到達時,大小爲16kb(帶有額外的小開銷:偏移量,pieceIndex等)。偶爾,當收到MessageLength時,它會從前一個消息中的隨機部分接收數據,而不是實際的消息長度。這個問題的一部分是,它並不總是發生在一個設置的偏移量(例如文件/塊/ 16 kb塊的開始或結束),並可能發生在任何文件,但發生更多,如果我發送更多的文件/更大的文件。
有內部消息發送(例如RequestMessages),從未遇到此問題。所有內部消息都是< 100個字節。
我試過等待文件塊完全保存,然後再請求另一個塊,但仍然失敗。我也嘗試限制一次發送多少個區塊,但是這隻能解決使用127.0.0.1(本地客戶端)而不是跨網絡(LAN)的問題。
我花了幾個小時瀏覽我的應用程序,看看是否有任何問題,但我還沒有看到它將發送錯誤的數據作爲標題。這個問題總是出現在兩個客戶端的發送和接收之間。是否有設置我應該使用的套接字/發送方法?或者它可能是某種競爭條件(我曾考慮過競態條件,但事實是數據可以隨機存放在一個文件中,這讓我重新思考這一點)。
聽起來像您的代碼中的錯誤。這將是一個猜謎遊戲,沒有一個簡短的自包含代碼示例。 – spender 2012-04-27 20:09:28
你可能是對的。我忙於工作atm,我會看看我是否可以在今晚晚些時候添加一些更具體的代碼。 – Mike 2012-04-27 21:20:37