socket通信如何處理每次包長度不定問題


說起來,這是一個漫長的問題:

客戶端和服務器通信的結構是:包頭+數據長度+數據

客戶端請求服務器發送200包數據。包頭=request;長度=4(一個int),數據=200;

服務器在收到客戶端的請求后,在while循環里面不停的send,直到夠200包:包頭=indicate 長度=XX,后面跟一大串數據;發完以后,再發一個結束的包:包頭=end,長度-1,data=無效值。

在服務器端,在while循環里不停的recv:先recv包頭,在recv長度。如果判斷是數據,然后recv數據。如果判斷是結束包,那么break出循環。

這個看似沒有問題的程序,實際存在一個問題:

在客戶端,recv包頭和長度后,recv數據,可能出現數據並沒有全部傳過來的情況,比如recv長度后,得知后面的數據有15000字節。但是由於阻塞等原因,只傳過來了7000字節。那么按照原來程序的邏輯,就會在下一次recv包頭和長度時,將實際發送的剩下的8000字節當做新一包的包頭,然后解包,這樣就出現了錯誤。

我的處理辦法是,如果recv數據時,實際收到的長度不等於發送數據長度,那么就搞一個小的while循環,在循環中把這一包收滿(為了保證收滿,可以sleep(10)),然后跳出來,繼續收下一包,就解決了。

這個辦法是很土,但是由於每包的長度不定,所以暫時只能想到這個辦法解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM