Уильям Стивенс - UNIX: разработка сетевых приложений
- Название:UNIX: разработка сетевых приложений
- Автор:
- Жанр:
- Издательство:Питер
- Год:2007
- Город:Санкт-Петербург
- ISBN:5-94723-991-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Уильям Стивенс - UNIX: разработка сетевых приложений краткое содержание
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
UNIX: разработка сетевых приложений - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Level | optname | get | set | Описание | Флаг | Тип данных |
---|---|---|---|---|---|---|
IPPROTO_TCP | TCP_MAXSEG | • | • | Максимальный размер сегмента TCP | int | |
TCP_NODELAY | • | • | Отключает алгоритм Нагла | • | int | |
IPPROTO_SCTP | SCTP_ADAPTION_LAYER | • | • | Указание на уровень адаптации | sctp_setadaption | |
SCTP_ASSOCINFO | + | • | Получение и задание сведений об ассоциации | sctp_assocparamms{} | ||
SCTP_AUTOCLOSE | • | • | Автоматическое закрытие | int | ||
SCTP_DEFAULT_SEND_PARAM | • | • | Параметры отправки но умолчанию | sctp_sndrcvinfo{} | ||
SCTP_DISABLE_FRAGMENTS | • | • | Фрагментация SCTP | • | int | |
SCTP_EVENTS | • | • | Уведомление об интересующих событиях | sctp_event_subscribe{} | ||
SCTP_GET_PEER_ADDR_INFO | + | Получение состояния адреса собеседника | sctp_paddrinfo{} | |||
SCTP_I_WANT_MAPPED_V4_ADDR | • | • | Отображение адресов IPv4 | • | int | |
SCTP_INITMSG | • | • | Параметры пакета INIT по умолчанию | sctp_initmsg{} | ||
SCTP_MAXBURST | • | • | Максимальный размер набора пакетов | int | ||
SCTP_MAXSEG | • | • | Максимальный размер фрагментации | int | ||
SCTP_NODELAY | • | • | Отключение алгоритма Нагла | • | int | |
SCTP_PEER_ADDR_PARAMS | + | • | Параметры адреса собеседника | sctp_paddrparams{) | ||
SCTP_PRIMARY_ADDR | + | • | Основной адрес назначения | sctp_setprim{} | ||
SCTP_RTOINFO | + | • | Информация RTO | sctp_rtoinfo{} | ||
SCTP_SET_PEER_PRIMARY_ADDR | • | Основной адрес назначения собеседника | sctp_setpeerprim{} | |||
SCTP_STATUS | + | Получение сведений о статусе ассоциации | sctp_status{} |
Существует два основных типа параметров: двоичные параметры, включающие или отключающие определенное свойство (флаги), и параметры, получающие и возвращающие значения параметров, которые мы можем либо задавать, либо проверять. В колонке «Флаг» указывается, относится ли параметр к флагам. Для флагов при вызове функции getsockopt
аргумент *optval
является целым числом. Возвращаемое значение *optval
нулевое, если параметр отключен, и ненулевое, если параметр включен. Аналогично, функция setsockopt
требует ненулевого значения *optval
для включения параметра, и нулевого значения — для его выключения. Если в колонке «Флаг» не содержится символа «•», то параметр используется для передачи значения заданного типа между пользовательским процессом и системой.
В последующих разделах этой главы приводятся дополнительные подробности о параметрах сокетов.
7.3. Проверка наличия параметра и получение значения по умолчанию
Напишем программу, которая проверяет, поддерживается ли большинство параметров, представленных в табл. 7.1 и 7.2, и если да, то выводит их значения, заданные по умолчанию. В листинге 7.1 [1] Все исходные коды программ, опубликованные в этой книге, вы можете найти по адресу http://www.piter.com.
содержатся объявления нашей программы.
Листинг 7.1. Объявления для нашей программы, проверяющей параметры сокетов
//sockopt/checkopts.с
1 #include "unp.h"
2 #include /* определения констант TCP_xxx */
3 union val {
4 int i_val;
5 long l_val;
6 struct linger linger_val;
7 struct timeval timeval_val;
8 } val;
9 static char *sock_str_flag(union val*, int);
10 static char *sock_str_int(union val*, int);
11 static char *sock_str_linger(union val*, int);
12 static char *sock_str_timeval(union val*, int);
13 struct sock_opts {
14 const char *opt_str;
15 int opt_level;
16 int opt_name;
17 char *(*opt_val_str)(union val*, int);
18 } sock_opts[] = {
19 { "SO_BROADCAST", SOL_SOCKET, SO_BROADCAST, sock_str_flag },
20 { "SO_DEBUG", SOL_SOCKET, SO_DEBUG, sock_str_flag },
21 { "SO_DONTROUTE", SOL_SOCKET, SO_DONTROUTE, sock_str_flag },
22 { "SO_ERROR", SOL_SOCKET, SO_ERROR, sock_str_int },
23 { "SO_KEEPALIVE", SOL_SOCKET, SO_KEEPALIVE, sock_str_flag },
24 { "SO_LINGER", SOL_SOCKET, SO_LINGER, sock_str_linger },
25 { "SO_OOBINLINE", SOL_SOCKET, SO_OOBINLINE, sock_str_flag },
26 { "SO_RCVBUF", SOL_SOCKET, SO_RCVBUF, sock_str_int },
27 { "SO_SNDBUF", SOL_SOCKET, SO_SNDBUF, sock_str_int },
28 { "SO_RCVLOWAT", SOL_SOCKET, SO_RCVLOWAT, sock_str_int },
29 { "SO_SNDLOWAT", SOL_SOCKET, SO_SNDLOWAT, sock_str_int },
30 { "SO_RCVTIMEO", SOL_SOCKET, SO_RCVTIMEO, sock_str_timeval },
31 { "SO_SNDTIMEO", SOL_SOCKET, SO_SNDTIMEO, sock_str_timeval },
32 { "SO_REUSEADDR", SOL_SOCKET, SO_REUSEADDR, sock_str_flag },
33 #ifdef SO_REUSEPORT
34 { "SO_REUSEPORT", SOL_SOCKET, SO_REUSEPORT, sock_str_flag },
35 #else
36 { "SO_REUSEPORT", 0, 0, NULL },
37 #endif
38 { "SO_TYPE", SOL_SOCKET, SO_TYPE, sock_str_int },
39 { "SO_USELOOPBACK", SOL_SOCKET, SO_USELOOPBACK, sock_str_flag },
40 { "IP_TOS", IPPROTO_IP, IP_TOS, sock_str_int },
41 { "IP_TTL", IPPROTO_IP, IP_TTL, sock_str_int },
42 { "IPV6_DONTFRAG", IPPROTO_IPV6, IPV6_DONTFRAG, sock_str_flag },
43 { "IPV6_UNICAST_HOPS", IPPROTO_IPV6, IPV6_UNICAST_HOPS, sock_str_int },
44 { "IPV6_V6ONLY", IPPROTO_IPV6, IPV6_V6ONLY, sock_str_flag },
45 { "TCP_MAXSEG", IPPROTO_TCP, TCP_MAXSEG, sock_str_int },
46 { "TCP_NODELAY", IPPROTO_TCP, TCP_NODELAY, sock_str_flag },
47 { "SCTP_AUTOCLOSE", IPPROTO_SCTP, SCTP_AUTOCLOSE, sock_str_int },
48 { "SCTP_MAXBURST", IPPROTO_SCTP, SCTP_MAXBURST, sock_str_int },
49 { "SCTP_MAXSEG", IPPROTO_SCTP, SCTP_MAXSEG, sock_str_int },
50 { "SCTP_NODELAY", IPPROTO_SCTP, SCTP_NODELAY, sock_str_flag },
51 { NULL, 0, 0, NULL }
52 };
3-9
Наше объединение val
содержит по одному элементу для каждого возможного возвращаемого значения из функции getsockopt
.
10-13
Мы определяем прототипы для четырех функций, которые вызываются для вывода значения данного параметра сокета.
14-46
Наша структура sock_opts
содержит всю информацию, которая необходима, чтобы вызвать функцию getsockopt
для каждого из параметров сокета и вывести его текущее значение. Последний элемент, opt_val_str
, является указателем на одну из четырех функций, которые выводят значение параметра. Мы размещаем в памяти и инициализируем массив этих структур, каждый элемент которого соответствует одному параметру сокета.
Не все реализации поддерживают полный набор параметров сокетов. Чтобы определить, поддерживается ли данный параметр, следует использовать #ifdef или #if defined, как показано для параметра SO_REUSEPORT. Для полноты картины требуется обработать подобным образом все параметры, но в книге мы пренебрегаем этим, потому что #ifdef только удлиняет показанный код и не влияет на суть дела.
В листинге 7.2 показана наша функция main
.
Листинг 7.2. Функция main для проверки параметров сокетов
//sockopt/checkopts.c
53 int
54 main(int argc, char **argv)
55 {
56 int fd;
57 socklen_t len;
58 struct sock_opts *ptr;
59 for (ptr = sock_opts; ptr->opt_str != NULL; ptr++) {
60 printf("%s: ptr->opt_str);
61 if (ptr->opt_val_str == NULL)
62 printf("(undefined)\n");
63 else {
64 switch(ptr->opt_level) {
Интервал:
Закладка: