**
收到資料報後進行包計數。
記錄收端處理資料耗時,對比發端耗時。
最大容量下耗時超過了發包耗時
(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...