send( SOCKET s, const char FAR* buf,int len, int flags);
recv( SOCKET s, char FAR* buf, int len, int flags);
使用TCP發送和接收資料,發送檔案也就2M左右,拆成多個包發送,每次發送5K,在接收端,我需要判定每次接收到的包大小,所以使用
int len=recv( s, buff, mMaxNub, int flags);
發現,我每次發送的buff為5K,在接收判斷len時每次都有9K,接收到的包明顯大于發送過來的包,這是怎么回事?
uj5u.com熱心網友回復:
tcp是流式的協議,不能保證每次接收的就是上一次發送的大小uj5u.com熱心網友回復:
是啊,這個知道。
問題從第一個包開始,每次都是接收的包明顯大于發送端發送過來的資料包大小。首次發送5K竟然會接收到10K的資料。
uj5u.com熱心網友回復:
這個正常的呀,你發送都用回圈send和回圈recv,要判斷send和recv的回傳值
uj5u.com熱心網友回復:
感覺是粘包造成的,發送時發送端包粘的一塌糊涂,接收時全亂套了。uj5u.com熱心網友回復:
1、這是正常的。2、要保證同樣大小也很簡單,增加一層接收資料處理,按照包頭指定的資料長度,裝配好一個長度不長不短的包,再給上層業務處理;
3、粘包這個彩逼生造的詞本就狗屁不通,協議就是這么定的一個緊接著一個,粘個屁,你會說你收資料時部分收到是“拆包”造成的嗎?這詞很sb
uj5u.com熱心網友回復:
自定義發送的資料格式,比如 包頭,長度,資料,包的結束標志,然后每次接收判斷就行了uj5u.com熱心網友回復:
不能這樣玩1.你發送每次5k
2.你接收每次也要保證5k,而且回圈接收,你接收指定接收大小是5k嗎
3.徹底的解決方式就是加個包頭,根據包頭接收指定大小
uj5u.com熱心網友回復:
不知道有多少前人掉在TCP Socketsend(人多)send(病少)send(財富)
recv(人多病)recv(少財富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/122934.html
標籤:基礎類
