大佬們,我想請問一下,Linux的udp套接字接收到的資料報大小超出該套接字接識訓沖區大小時,為什么還是可以正常接收?
linux manual udp說:當接收到的資料報裝不進套接字接識訓沖區時,該資料報被截斷。
我用setsockopt給接收udp套接字設定了較小接受緩沖區后(設定結束又用getsockopt檢查,沒問題),用本地回環的另一個行程向它發送了大于該緩沖區好幾倍的資料,卻仍然可以正常接收。
接收行程:
char buf[40000];
int confd=socket(AF_INET,SOCK_DGRAM,0);
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=htonl(INADDR_ANY);
addr.sin_port=htons(9122);
bind(confd,&addr,sizeof(addr));
int val=3000;
int res=setsockopt(confd,SOL_SOCKET,SO_RCVBUF,&val,sizeof(int));
int len=sizeof(int);
res=getsockopt(confd,SOL_SOCKET,SO_RCVBUF,&val,&len);
printf("res : %d val:%d",res,val);
sleep(60);
int n=recvfrom(confd,buf,sizeof(buf),0,NULL,NULL);
printf("%s\n",buf);
printf("第一次:%d\n",n);
發送行程:
char buf[40000];
int sendfd=socket(AF_INET,SOCK_DGRAM,0);
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=inet_addr("127.0.0.1");
addr.sin_port=htons(9122);
memset(buf,1,sizeof(buf));
int n=sendto(sendfd,buf,sizeof(buf),0,&addr,sizeof(addr));
printf("第一次:%d\n",n);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/135708.html
標籤:C語言
