Поведение SO_SNDBUF при использовании 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. Поэтому цикл while должен завершиться, когда буфер отправки writeFD ​​заполнен.

Следующий результат виден:

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 используется заголовок фиксированного размера?

1 ответ

Похоже на: AF_UNIX сокет накладных расходов?,

Достигнутый предел должен быть net.unix.max_dgram_qlen: максимальное количество датаграмм для постановки в очередь.

Чтобы прочитать фактическое значение:

sysctl net.unix.max_dgram_qlen

Чтобы установить новое значение:

sysctl net.unix.max_dgram_qlen=...
Другие вопросы по тегам