gpt4 book ai didi

c++ - 使用 socketpair 时 SO_SNDBUF 的行为

转载 作者:太空狗 更新时间:2023-10-29 22:59:18 25 4
gpt4 key购买 nike

我想使用 socketpair 在两个线程之间发送消息。我正在编写代码以找出使用 socketpair 可以发送多少条消息,消息大小为 16 字节(两个指针)。我使用的代码如下:

int fds[2];
socketpair(AF_LOCAL, SOCK_STREAM, PF_UNSPEC, fds);

int readFD=fds[0];
int writeFD=fds[1];
getsockopt(readFD, SOL_SOCKET, SO_SNDBUF, &rSndBuff, &optlen);
getsockopt(readFD, SOL_SOCKET, SO_RCVBUF, &rRcvBuff, &optlen);
cout <<"Read FD : Send Buff : "<<rSndBuff<<" Recv Buff : "<<rRcvBuff<<endl;
getsockopt(writeFD, SOL_SOCKET, SO_SNDBUF , &wSndBuff, &optlen);
getsockopt(writeFD, SOL_SOCKET, SO_RCVBUF , &wRcvBuff, &optlen);
cout <<"Write FD : Send Buff : "<<wSndBuff<<" Recv Buff : "<<wRcvBuff<<endl;

int count=0;
while ( 1 )
{
char * im[2];
int sentCount=send(writeFD, im, sizeof(im), MSG_DONTWAIT | MSG_NOSIGNAL);

if(sentCount<0)
{
ioctl ( readFD , FIONREAD , &rRcvBuff );
cout <<"Size of data sent in one message : "<<sizeof(im)<<endl;
cout <<"Recv Buff : "<<rRcvBuff<<endl;
cout <<"Sent : " <<sizeof(im)*count<<endl;
cout<<"Unable to send : "<< errno<< " "<<strerror(errno)<<endl;
cout<<"Count : " <<count<<endl;
break;
}
else if(sentCount!=sizeof(im))
{
ioctl ( readFD , FIONREAD , &rRcvBuff );
cout <<"Recv Buff : "<<rRcvBuff<<endl;
cout<<EMSGSIZE<<endl;
cout<<"Count : " <<count<<endl;
break;
}
count++;
}

没有线程/进程正在监听 readFD。所以当 writeFD​​ 的发送缓冲区已满时,while 循环应该退出。

可以看到以下输出:

Read FD : Send Buff : 129024 Recv Buff : 129024
Write FD : Send Buff : 129024 Recv Buff : 129024
Size of data sent in one message : 16
Recv Buff : 5504
Sent : 5504
Unable to send : 11 Resource temporarily unavailable
Count : 344

我预计发送的消息数约为 4032 ( 129024/(2*16) )。

我在这里错过了什么?在 AF_LOCAL 中发送消息时是否使用固定大小的 header ?

最佳答案

似乎类似于:AF_UNIX socket overhead? .

达到的限制应该是 net.unix.max_dgram_qlen:要排队的数据报的最大数量。

读取实际值:

sysctl net.unix.max_dgram_qlen

设置新值:

sysctl net.unix.max_dgram_qlen=...

关于c++ - 使用 socketpair 时 SO_SNDBUF 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37291100/

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