Linux網路程式設計 UDP接收資料丟包解決方案

2021-08-17 07:56:33 字數 1883 閱讀 5028

** 

收到資料報後進行包計數。 

記錄收端處理資料耗時,對比發端耗時。 

最大容量下耗時超過了發包耗時

(2)recvfrom()接收到資料之後處理速度太慢

udp是沒有流量控制的:

因此,如果socket接收快取設定過小,就會因為udp包過大或者發包速率過快而丟包 

[2] 解決方法:重新設定udp接收緩衝區大小

udp接收緩衝區最大值:cat /proc/sys/net/core/rmem_max,udp最大可設定值的一半 

udp接收緩衝區最小值:sysctl -a | grep rmem

udp傳送緩衝區預設值:cat /proc/sys/net/core/wmem_default

udp傳送緩衝區最大值:cat /proc/sys/net/core/wmem_max 

udp傳送緩衝區最小值:sysctl -a | grep wmem 

[3] 解決步驟:

或重新設定系統緩衝區最大值,再調整udp緩衝區大小:

執行配置:sysctl -p

重新檢視最大值:cat /proc/sys/net/core/rmem_max

發現系統接收緩衝最大值已改變,此時可以通過setsockopt函式設定更大接收快取。傳送緩衝最大值也可以通過類似方式修改:net.core.wmem_max = 6291456,sysctl -p

/* setsockopt()函式修改:*/

//函式原型

int setsockopt(int sockfd, int level, int optname, const

void *optval, socklen_t optlen);

sockfd: 標識乙個套接字的描述字

level: 選項定義的層次:支援sol_socket, ipproto_tcp, ipproto_ip,和ipproto_ipv6

optname:需設定得選項 so_rcvbuf(接收緩衝區),so_sndbuf(傳送緩衝區)

optval:指標,指向存放選項待設定的新值的緩衝區

optlen:optval的大小

//示例

int recv_size = 2 * 1024 * 1024; //設定為4m

setsockopt(s,sol_socket, so_rcvbuf, (const

char *)&recv_size,sizeof(recv_size));

recvfrom()接收速率並不是系統受限因素

資料處理是速度受限因素之一

執行緒掛起再喚醒耗時受限速度之二

[2] 解決方法:

執行緒響應速度受限:保持執行緒一直在執行或監聽狀態

[3] 解決步驟:

抓包執行緒一直處於執行狀態:while 

tcp接收緩衝區最大值:cat /proc/sys/net/core/rmem_max ,tcp最大可設定值的一半(與udp同) 

tcp接收緩衝區最小值:sysctl -a | grep rmem 

通用命令:cat /proc/sys/net/ipv4/tcp_rmem 

tcp接收緩衝區大小

tcp傳送緩衝區最大值:cat /proc/sys/net/core/wmem_max,tcp最大可設定值的一半 

tcp傳送緩衝區最小值:sysctl -a | grep wmem 

通用命令:cat /proc/sys/net/ipv4/tcp_wmem 

注:通過cat /proc/sys/net/ipv4/tcp_wmem命令和cat /proc/sys/net/core/wmem_max命令得出的tcp傳送緩衝區最大值不一致,我覺得應該以cat /proc/sys/net/ipv4/tcp_wmem為準,即最大值為4m。

linux網路程式設計 udp

udp udp收發 udp 協議不需要建立連線,類似於傳送簡訊,因此 udp 的程式設計方式比 tcp 更加簡單。udp 有其自己特有的接受與傳送資料的函式 socket af inet,sock dgram,0 建立socket bind socket fd,struct sockaddr ser...

Linux 網路程式設計(二)UDP程式設計

資料報通訊 對於資料報通訊的伺服器端來說,它不必再在乙個埠上偵聽,以等待建立連線,而只需生成乙個埠描述符,並且把這個埠描述符繫結到本地位址上就可以了。udp網路程式設計具體的操作流程為 使用系統呼叫socket 來獲得檔案描述符,該呼叫的宣告格式為 connect 系統呼叫由客戶端呼叫,它的用法如下...

Linux網路程式設計 UDP程式設計例項

使用udp協議通訊時伺服器端和客戶端無需建立連線,只要知道對方套接字的位址資訊,就可以傳送資料。伺服器端只需建立乙個套接字用於接收不同客戶端發來的請求,經過處理後再把結果傳送給對應的客戶端。伺服器端和客戶端使用udp的流程如下圖示 伺服器端 server.c include include incl...