10.3. Чтобы каждая порция данных была помещена в свой пакет, мы установили размер сообщения 800 байт. Более правильным решением будет получение значения параметра сокета SCTP_MAXSEG
10.4. Алгоритм Нагла (управляемый параметром сокета SCTP_NODELAY
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",
12 ptr, hstrerror(h_errno));
13 continue;
14 }
15 printf("official hostname: %s\n", hptr->h_name);
16 for (pptr = hptr->h_aliases; *pptr != NULL; pptr++)
17 printf(" alias: %s\n", *pptr);
18 switch (hptr->h_addrtype) {
19 case AF_INET:
20 #ifdef AF_INET6
21 case AF_INET6:
22 #endif
23 pptr = hptr->h_addr_list;
24 for (; *pptr != NULL; pptr++) {
25 printf("\taddress: %s\n",
26 Inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));
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-адрес:
freebsd % hostent2 cnn.com
official hostname: cnn.com
address: 64.236.24.4
name = www1.cnn.com