我有一个测试unix域服务器,它具有以下内容,因此将SNDBUF设置为1024000
接通时:
for ( ; ; ) {
connfd = accept(fdfromps, 0, 0);
int new_size = 1024000 ;
setsockopt(connfd, SOL_SOCKET, SO_SNDBUF , &new_size, sizeof(new_size));
SetSocketBlockingEnabled(connfd,false) ;
FDArray[connfd] = 1 ;
} //for
同时将此fd设置为非阻塞
客户端不会接收服务器发送给客户端的任何包,因此
可以在服务器发送遇到错误(errno=11)时测量计数器,
来源如下:
测试1:
strcpy(msg,"1234567890");
测试2:
sprintf(msg,"%s%s%s%s%s",
"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890",
"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890",
"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890",
"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890",
"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890") ;
测试代码:
sprintf(strsend,"%04d%s",strlen(msg),msg) ;
int icnt = 0 ;
pthread_detach(pthread_self());
while( 1 ){
for(int idx=0;idx<20;idx++){
if( FDArray[idx] == 1 ){
int nread = send(idx,strsend,strlen(strsend),MSG_NOSIGNAL);
if( nread < 0 ){
printf("send to (%d) ...errno=(%d) \n",idx,errno );
FDArray[idx] = 0 ;
}else{
printf("send to (%d) ... nread=(%d) \n", idx ,nread ) ;
++icnt ;
}
}
}
printf("......(%d) \n",icnt) ;
usleep( 10000 ) ;
}
Test1其中msg有14个字节,icnt是2667,Test2其中msg有504个字节,
icnt是1600。
我被数字2667和1600弄糊涂了,因为504字节比
14字节,我想Test2的icnt应该比Test1的icnt大得多,
有什么可以解释的吗?!
环境:
sysctl -a | grep "mem"
:net.core.rmem_default = 212992
net.core.rmem_max = 1024000
net.core.wmem_default = 212992
net.core.wmem_max = 1024000
uname -a
:3.10.0-327.el7.x86_64
编辑:
int res = 0 ;
optlen = sizeof(sendbuff);
getsockopt(connfd, SOL_SOCKET, SO_SNDBUF , &sendbuff, &optlen);
if(res == -1)
printf("Error getsockopt one");
else
printf("send buffer size = %d\n", sendbuff);
int new_size = 512000 ;
setsockopt(connfd, SOL_SOCKET, SO_SNDBUF , &new_size, sizeof(new_size));
getsockopt(connfd, SOL_SOCKET, SO_SNDBUF , &sendbuff, &optlen);
if(res == -1)
printf("Error getsockopt one");
else
printf("send buffer size = %d\n", sendbuff);
编辑2:
ss -ax | grep "testud" ## testud is the nnix domain name
当Send-Q在1024000左右时将显示,非阻塞Send-get errno=11
从那以后,这就是我所观察到的,我不知道它会有什么帮助。
最佳答案
内核可以向上或向下调整SO_SNDBUF值。试着在设置之后用getsockopt()
获取它,看看它到底是什么。