Книга: UNIX: разработка сетевых приложений

Приемный буфер сокета UDP

Приемный буфер сокета UDP

Число дейтаграмм UDP, установленных в очередь UDP, для данного сокета ограничено размером его приемного буфера. Мы можем изменить его с помощью параметра сокета SO_RCVBUF, как мы показали в разделе 7.5. В FreeBSD по умолчанию размер приемного буфера сокета UDP равен 42 080 байт, что допускает возможность хранения только 30 из наших 1400-байтовых дейтаграмм. Если мы увеличим размер приемного буфера сокета, то можем рассчитывать, что сервер получит дополнительные дейтаграммы. В листинге 8.12 представлена измененная функция dg_echo из листинга 8.10, которая увеличивает размер приемного буфера сокета до 240 Кбайт. Если мы запустим этот сервер в системе Sun, а клиент — в системе RS/6000, то счетчик полученных дейтаграмм будет иметь значение 103. Поскольку это лишь немногим лучше, чем в предыдущем примере с размером буфера, заданным по умолчанию, ясно, что мы пока не получили решения проблемы.

Листинг 8.12. Функция dg_echo, увеличивающая размер приемного буфера сокета

//udpcliserv/dgecholоор2.c
 1 #include "unp.h"
 2 static void recvfrom_int(int);
 3 static int count;
 4 void
 5 dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)
 6 {
 7  int n;
 8  socklen_t len;
 9  char mesg[MAXLINE];
10  Signal(SIGINT, recvfrom_int);
11  n = 240 * 1024;
12  Setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n));
13  for (;;) {
14   len = clilen;
15   Recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);
16   count++;
17  }
18 }
19 static void
20 recvfrom_int(int signo)
21 {
22  printf("nreceived %d datagramsn", count);
23  exit(0);
24 }

ПРИМЕЧАНИЕ

Почему мы устанавливаем размер буфера приема сокета равным 240?1024 байт в листинге 8.12? Максимальный размер приемного буфера сокета в BSD/OS 2.1 по умолчанию равен 262 144 байта (256?1024), но из-за способа размещения буфера в памяти (описанного в главе 2 [128]) он в действительности ограничен до 246 723 байт. Многие более ранние системы, основанные на 4.3BSD, ограничивали размер буфера приема сокета примерно до 52 000 байт.

Оглавление книги

Оглавление статьи/книги

Генерация: 1.301. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз