提及來,這是一個漫長的問題:服務器
客戶端和服務器通訊的結構是:包頭+數據長度+數據服務器端
客戶端請求服務器發送200包數據。包頭=request;長度=4(一個int),數據=200;循環
服務器在收到客戶端的請求後,在while循環裏面不停的send,直到夠200包:包頭=indicate 長度=XX,後面跟一大串數據;發完之後,再發一個結束的包:包頭=end,長度-1,data=無效值。request
在服務器端,在while循環裏不停的recv:先recv包頭,在recv長度。若是判斷是數據,而後recv數據。若是判斷是結束包,那麼break出循環。請求
這個看似沒有問題的程序,實際存在一個問題:程序
在客戶端,recv包頭和長度後,recv數據,可能出現數據並無所有傳過來的狀況,好比recv長度後,得知後面的數據有15000字節。可是因爲阻塞等緣由,只傳過來了7000字節。那麼按照原來程序的邏輯,就會在下一次recv包頭和長度時,將實際發送的剩下的8000字節當作新一包的包頭,而後解包,這樣就出現了錯誤。通信
個人處理辦法是,若是recv數據時,實際收到的長度不等於發送數據長度,那麼就搞一個小的while循環,在循環中把這一包收滿(爲了保證收滿,能夠sleep(10)),而後跳出來,繼續收下一包,就解決了。數據
這個辦法是很土,可是因爲每包的長度不定,因此暫時只能想到這個辦法解決。
客戶端