UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
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_REUSEPORT34 { "SO_REUSEPORT", SOL_SOCKET, SO_REUSEPORT, sock_str_flag },35 #else36 { "SO_REUSEPORT", 0, 0, NULL },37 #endif38 { "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-9valgetsockopt10-1314-46sock_optsgetsockoptopt_val_strНе все реализации поддерживают полный набор параметров сокетов. Чтобы определить, поддерживается ли данный параметр, следует использовать #ifdef или #if defined, как показано для параметра SO_REUSEPORT. Для полноты картины требуется обработать подобным образом все параметры, но в книге мы пренебрегаем этим, потому что #ifdef только удлиняет показанный код и не влияет на суть дела.
В листинге 7.2 показана наша функция
mainЛистинг 7.2. Функция main для проверки параметров сокетов
//sockopt/checkopts.c53 int54 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)
