10.2. Если сервер получает запрос и завершает работу, клиент (в его нынешней форме) зависает навечно в ожидании ответа сервера. Клиенту следует включить доставку уведомлений о событиях для данной ассоциации. Когда сервер завершит работу, клиент получит соответствующее сообщение и сможет принять какие-либо меры, например связаться с другим сервером. Альтернативным решением может быть установка таймера и завершение работы по истечении времени ожидания.
10.3. Чтобы каждая порция данных была помещена в свой пакет, мы установили размер
сообщения 800 байт. Более правильным решением будет получение значения параметра сокета
SCTP_MAXSEG
для определения размера данных, помещающихся в один пакет.
, см. раздел 7.10) вызывает проблемы только при передаче данных небольших объемов. Если данные передаются порциями такого размера, что SCTP вынужден передавать их немедленно, никакого замедления быть не может. Установка небольшого размера
out_sz
исказит результаты, потому что в некоторых случаях передача будет задерживаться до получения выборочных уведомлений от собеседника. Поэтому при передаче данных небольшого размера алгоритм Нагла следует отключать.
10.5. Если приложение устанавливает ассоциацию и изменяет количество потоков, количество потоков в данной ассоциации не меняется. Количество потоков может быть задано только для новых ассоциаций, но не для существующих.
Сокет типа «один-ко-многим» позволяет устанавливать ассоциации неявно. Для изменения параметров ассоциации необходимо вызвать
sendmsg
со вспомогательными данными. Фактически при этом обязательно использовать неявное установление ассоциации.
Глава 11
11.1. В листинге Д.4 приведена программа, вызывающая функцию
gethostbyaddr
.
Листинг Д.4. Изменение листинга 11.1 для вызова функции gethostbyaddr
//names/hostent2.c
1 #include "unp.h"
2 int
3 main(int argc, char **argv)
4 {
5 char *ptr, **pptr;
6 char str[INET6_ADDRSTRLEN];
7 struct hostent *hptr;
8 while (--argc > 0) {
9 ptr = *++argv;
10 if ( (hptr = gethostbyname(ptr)) == NULL) {
11 err_msg("gethostbyname error for host: %s: %s",
27 if ((hptr = gethostbyaddr(*pptr, hptr->h_length,
28 ptr->h_addrtype)) == NULL)
29 printf("\t(gethostbyaddr failed)\n");
30 else if (hptr->h_name != NULL)
31 printf("\tname = %s\n", hptr->h_name);
32 else
33 printf("\t(no hostname returned by gethostbyaddr)\n");
34 }
35 break;
36 default:
37 err_ret("unknown address type");
38 break;
39 }
40 }
41 exit(0);
42 }
Эта программа корректно работает на узле с единственным IP-адресом. Если запустить программу из листинга 11.1 на узле с четырьмя IP-адресами, то получим:
freebsd % hostent cnn.com
official hostname: cnn.com
address: 64.236.16.20
address: 64.236.16.52
address: 64.236.16.84
address: 64.236.16.116
address: 64 236.24.4
address: 64.236.24.12
address: 64.236.24.20
address: 64.236.24.28
Но если запустить программу из листинга Д.4 на том же узле, в выводе будет только первый IP-адрес: