gpt4 book ai didi

c - setsockopt SO_SNDBUF 及其在 unix 域中的行为

转载 作者:太空宇宙 更新时间:2023-11-04 12:38:10 24 4
gpt4 key购买 nike

我有一个测试 unix 域服务器,它有以下 SO_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 which msg has 14 bytes , icnt is 2667 , Test2 which msg has 504 bytes,icnt 是 1600。

我对数字 2667 和 1600 感到困惑,因为 504 字节比14个字节,我预计Test2的icnt应该比Test1的icnt大很多,有什么可以解释的吗?!

环境:

sysctl -a | grep“内存”:

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 时,非阻塞发送 get errno =11从那以后,这就是我观察到的,但不知道它是否有帮助。

最佳答案

内核可以向上或向下调整 SO_SNDBUF 值。设置后尝试使用 getsockopt() 获取它,看看它到底是什么。

关于c - setsockopt SO_SNDBUF 及其在 unix 域中的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41030621/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com