如果我發送1000個「Hello World!」 UDP消息(12字節+ 28 IP/UDP開銷),我觀察到在接收端我只緩衝658(總是相同的數字,658 * 40 = 26320字節)。我這樣做,通過在服務器上睡眠時發送UDP消息(創建套接字之後)。沒有填充接收緩衝區的UDP緩衝區溢出?
奇怪的是服務器上的SO_RCVBUF選項是42080字節。所以,我想知道爲什麼我不能緩衝1000條消息。你知道剩下的15760字節花在哪裏嗎?
下面的服務器代碼(其中包含distrib.h的插座和信號處理功能,基本的錯誤處理包裝):
#include "distrib.h"
static int count;
static void sigint_handler(int s) {
printf("\n%d UDP messages received\n",count);
exit(0);
}
int main(int argc, char **argv)
{
struct addrinfo* serverinfo;
struct addrinfo hints;
struct sockaddr_storage sender;
socklen_t len;
int listenfd,n;
char buf[MAXLINE+1];
if (argc != 2) {
log_error("usage: %s <port>\n", argv[0]);
exit(1);
}
Signal(SIGINT,sigint_handler);
bzero(&hints,sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_protocol = IPPROTO_UDP;
Getaddrinfo("127.0.0.1", argv[1], &hints, &serverinfo);
listenfd = Socket(serverinfo->ai_family, serverinfo->ai_socktype,
serverinfo->ai_protocol);
Bind(listenfd, serverinfo->ai_addr,serverinfo->ai_addrlen);
freeaddrinfo(serverinfo);
count =0;
sleep(20);
while(true) {
bzero(buf,sizeof(buf));
len = sizeof(sender);
n = Recvfrom(listenfd, buf, MAXLINE, 0, (struct sockaddr*)&sender,&len);
buf[n]='\0';
count++;
}
close(listenfd);
return 0;
}
MAXLINE的價值是什麼? – thuovila 2013-05-08 11:34:30
你確定所有郵件都已發送嗎?服務器和客戶端程序都在同一臺計算機/網絡上嗎? – 2013-05-08 11:47:03
如果你在Linux上,你是否檢查_netstat -su_ [ref](http://stackoverflow.com/questions/10899937/udp-packet-drops-by-linux-kernel) – thuovila 2013-05-08 11:47:52