當前位置:首頁 » 文件管理 » socket接收緩存

socket接收緩存

發布時間: 2023-01-13 00:07:11

① 如何得知socket的緩存大小,這個緩存是否有上限,是否會溢出

一:如何得知socket的緩沖大小?
通過socket選項可以獲得socket的緩沖大小。(以下是python代碼,sock為socket對象)
sock.getsockopt(SOL_SOCKET,SO_RCVBUF):獲取接收緩沖區的大小
sock.getsockopt(SOL_SOCKET,SO_SNDBUF):獲得發送緩沖區的大小
註:UDP協議在內核實現中沒有發送緩沖區。

二:這個緩沖是否有上限?
緩沖區存在上限,沒一個socket對象的緩沖區有上限,系統中所有的socket緩沖區的總大小也存在上限。

三:是否會溢出?
TCP協議是可靠的有序的位元組流協議,其可靠性與接收端的滑動窗口機制有關,而滑動窗口和TCP的接收緩沖區有關。
TCP協議的緩沖區不會溢出,如果接收緩沖區已滿,則通告窗口為0,不能在接收發送端發過來的數據。如果發送緩沖區已滿(則可以說明對端的接收緩沖區一定已滿),應用層的send調用阻塞(採用阻塞式IO)。所以說TCP協議的緩沖區不會溢出。
UDP協議的緩沖區會溢出,UDP協議在實現上沒有發送緩沖區,接收緩沖區存在上限,當UDP的接收緩沖區達到上限時,以後接收到的數據報直接丟棄,這也是UDP協議不可靠的一個原因。
-----------------------------------------------------------------------------------------------------------
推薦你看一下陶輝的」高性能網路編程「系列,肯定會受益匪淺。

② 修改linux系統socket緩沖區大小

進行socket編程有時候可能需要修改下socket的接收緩沖區大小,這里可以使用 setsockopt 函數,但是如果需要修改的緩沖區很大(比如500MB),則還需要修改系統內核的TCP/IP參數,不然接收緩沖區大小會收到內核參數的限制,所以需要改兩個地方。下面以把socket接收緩沖區修改為500MB說明一下要作的修改。《Linux就該這么學》

  • 修改內核TCP/IP參數

在終端用sysctl命令修改socket最大緩沖區限制:

sudo sysctl -w net.core.rmem_max=5242880001

  • 在代碼中用setsockopt函數修改SO_RCVBUF選項

int recvbuff = 500*1024*1024;
if(setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, (const char*)&recvbuff, sizeof(int)) == -1)
printf("setsocket error ");
else
printf("setsocket success ");12345

以上兩點,只改第1點,一個socket只會預留63個報文的接收緩沖;只改第2點,緩沖區大小會受到rmem_max的限制,如果需要的緩沖區很大的話,必須兩點都改。

③ linux下,如何查看socket接收緩沖區有多大後修改

read的返回值中可以獲得大小,read結束之前你是沒法知道對方到底發多少給你的。通常的做法,我們會在通訊的報文前加上一些控制信息,比如前4個byte存放數據大小(是否包含這4個byte自己定義)、數據是否分片、每片大小、MAC、控制字元(防止其他程序誤發)等等。

④ socket接收緩沖區滿了要多長時間

半個小時。socket是一個抽象層,應用程序可以通過它發送或接收數據,socket在接收緩沖區想要接收滿了的話,是需要半個小時的時間的。接收緩沖區把數據緩存入內核,等待recv讀取,recv所作的工作,就是把內核緩沖區中的數據拷貝到應用層用戶的buffer裡面,並返回。

⑤ 怎麼清空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會不會堵塞,需要測試。

熱點內容
倩女幽魂桌面版腳本 發布:2025-09-01 00:49:34 瀏覽:102
androidpull解析xml 發布:2025-09-01 00:39:18 瀏覽:450
禁止代理訪問 發布:2025-09-01 00:35:36 瀏覽:920
泛微源碼 發布:2025-09-01 00:18:49 瀏覽:378
安卓手機文件夾管理 發布:2025-09-01 00:06:23 瀏覽:894
UE編譯項目會編譯源碼 發布:2025-08-31 23:56:45 瀏覽:653
安卓怎麼安裝tar 發布:2025-08-31 23:55:18 瀏覽:682
小米相冊緩存 發布:2025-08-31 23:55:16 瀏覽:24
怎麼查詢電視機的配置 發布:2025-08-31 23:50:59 瀏覽:938
阿里系資料庫 發布:2025-08-31 23:33:47 瀏覽:156