向大家請教一個問題。
我作為服務器端使用Socket API用 TCP協議發送資料。資料以256位元組為一幀,每秒發送一幀。
現在出現的問題是 在連續運行一天時間里會出現若干次 客戶端接收到的資料被重新分包的情況。
如某幀接收到374位元組,后一幀接收到128位元組,但是資料沒有丟。
請問這個現象是怎么產生的?
最關鍵的是如何避免這個問題。
請大家幫我分析一下。
uj5u.com熱心網友回復:
最干脆的做法是用短連接,發送一次斷開連接,再發送再建立連接。如果不得已用長連接,需要處理粘包
為了避免粘包現象,可采取以下幾種措施。一是對于發送方引起的粘包現象,用戶可通過編程設定來避免,TCP提供了強制資料立即傳送的操作指令push,TCP軟體收到該操作指令后,就立即將本段資料發送出去,而不必等待發送緩沖區滿;二是對于接收方引起的粘包,則可通過優化程式設計、精簡接收行程作業量、提高接收行程優先級等措施,使其及時接收資料,從而盡量避免出現粘包現象;三是由接收方控制,將一包資料按結構欄位,人為控制分多次接收,然后合并,通過這種手段來避免粘包。
uj5u.com熱心網友回復:
TCP是流協議,沒有訊息邊界,資料接收到多少為結束是程式員自己定義的。uj5u.com熱心網友回復:
您好,請問Windows socket通信中如何使用push指令? 我在網上沒有查到相關資料。
uj5u.com熱心網友回復:
版主您好,我是每秒發送一幀。如果是您提到TCP是流協議,那么通常提到的TCP資料包是不是就沒什么作用了?
uj5u.com熱心網友回復:
不知道有多少前人掉在TCP Socketsend(人多)send(病少)send(財富)
recv(人多病)recv(少財富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545
uj5u.com熱心網友回復:
TCP是stream式資料,并不會按你的包的大小來發送,接收,你需要發送的時候自己設定分界符等,然后接收的時候根據分界符進行決議處理uj5u.com熱心網友回復:
tcp 協議底層的事,自己根據需要讀,或者自己讀到快取,再從快取取轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/113955.html
標籤:網絡編程
