當前位置:首頁 » 硬碟大全 » androidsocket接收緩存
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

androidsocket接收緩存

發布時間: 2022-12-12 05:51:12

Ⅰ Socket接收數據怎麼清空緩存

通過Socket發送接收消息遇到個問題 C# code Socket newSocket = socket.Accept(); newSocket.Receive(messages); 獲取消息沒問題 但是總有緩存區無法清空的問題 比如說我先發一句:"我是中國人" 服務端能正確接收到這句消息:"我是中國人" 這邊再發送一個字:"你" 理想狀態下服務端應該顯示一個字:"你" 但是實際上由於緩存區尚未清空的緣故變成了:"你是中國人" 只有當消息長度大於緩存區消息時舊消息才能被完全覆蓋:"我不是中國人" 服務端這時能正確的顯示:"我不是中國人" ========================================================= 發送消息這邊我測試了下 發送出去的消息本身沒有問題 C# code socket.Send(byteMessage); socket.Shutdown(SocketShutdown.Both); socket.Close(); 但是到了接收方收到消息就出問題了。我想應該是緩沖區問題 望各位大大解惑------解決方案-------------------------------------------------------- 這是你數組的問題 跟Socket緩沖沒關系

Ⅱ 怎麼清空socket 接收緩存區

清空socket緩存區的數據的方法
由於socket是以數據流的形式發送數據,接收方不知道對方一次性發送了多少數據,也能保證對方一次性發送的數據能在同一刻接收到,所以Receive方法是這么工作的:
接受一個byye[]類型的參數作為緩沖區,在經過一定的時間後把接收到的數據填充到這個緩沖區裡面,並且返回實際接收到數據的長度,這個實際接收到的數據長度有可能為0(沒有接收到數據)、大於0小於緩沖區的長度(接收到數據,但是沒有我們預期的多)、等於緩沖區的長度(說明接收到的數據大於等於我們預期的長度)。
每次接收緩沖區都用同一個byte[] byteMessage,並且你沒有檢查接收到的數據長度,所以第一次你接收到的數據是123456,第二次你只接收到了8,但是緩沖區裡面還有23456,所以加起來就是823456了。
socket接收緩沖區的大小有講究,設置大了接收起來慢,因為它要等盡可能多的數據接收到了再返回;設置小了需要重復多次調用接收方法才能把數據接收完,socket有個屬性,標識了系統默認的接收緩沖區大小,可以參考這個!
還有就是用recv讀取,但是由於不知道緩存里有多少數據,如果是阻塞模式,到最後必然等到超時才知道數據已經讀取完畢,這是個問題。
另一個是用fgetc,通過返回判斷是否是feof:
whlie (1) { a=fgetc(f);if (feof(f)) break;//…
b=fgetc(f);if (feof(f)) break;//…}當然,我不知道讀取完畢後最後一次調用fgetc會不會堵塞,需要測試。