UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
20-21В листинге 23.8 представлен модифицированный эхо-сервер, связывающий сокет с набором адресов, передаваемых в командной строке. Мы слегка изменили код сервера, чтобы он отправлял эхо-сообщения по тем потокам, по которым были приняты исходные сообщения.
Листинг 23.8. Сервер, работающий с произвольным набором адресов
if (argc < 2) err_quit("Error, use %s [list of addresses to bind]n", argv[0]);sock_fd = Socket(AF_INET6, SOCK_SEQPACKET, IPPROTO_SCTP);if (sctp_bind_arg_list(sock_fd, argv + 1, argc — 1)) err_sys("Can't bind the address set");bzero(&evnts, sizeof(evnts));evnts sctp_data_io_event = 1;14AF_INET615-16sctp_bind_arg_list23.7. Получение адресов
Поскольку протокол SCTP ориентирован на многоинтерфейсные узлы, для определения адресов локального и удаленного узла не могут использоваться те же механизмы, что и в TCP. В этом разделе мы изменим код клиента, добавив в него подписку на уведомление о событии COMMUNICATION UP. В этом уведомлении клиент будет получать сведения об адресах, между которыми установлена ассоциация. В листингах 23.9 и 23.10 представлены изменения в коде клиента. Листинги 23.11 и 23.12 содержат добавления к коду клиента.
Листинг 23.9. Клиент включает уведомления
16 bzero(&evnts, sizeof(evnts));17 evnts.sctp_data_io_event = 1;18 evnts.sctp_association_event = 1;19 Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS, &evnts, sizeof(evnts));20 sctpstr_cli(stdin, sock_fd, (SA*)&servaddr, sizeof(servaddr));16-20mainПосмотрим, что нам придется изменить в функции
sctpstr_cliЛистинг 23.10. Функция sctp_strcli, способная работать с уведомлениями
21 do {22 len = sizeof(peeraddr);23 rd_sz = Sctp_recvmsg(sock_fd, recvline, sizeof(recvline),24 (SA*)&peeraddr, &len, &sri, &msg_flags);25 if (msg_flags & MSG_NOTIFICATION)26 check_notification(sock_fd, recvline, rd_sz);27 } while (msg_flags & MSG_NOTIFICATION);28 printf("From str:%d seq:%d (assoc.0x%x) ",29 sri.sinfo_stream, sri.sinfo_ssn, (u_int)sri.sinfo_assoc_id);30 printf("%.*s", rd_sz.recvline);21-24sctp_recvmsg25-262728-30Теперь мы можем изучить новую функцию
sctp_check_notificationЛистинг 23.11. Обработка уведомлений
//sctp/sctp_check_notify.c 1 #include "unp.h" 2 void 3 check_notification(int sock_fd, char *recvline, int rd_len) 4 { 5 union sctp_notification *snp; 6 struct sctp_assoc_change *sac; 7 struct sockaddr_storage *sal, *sar; 8 int num_rem, num_loc; 9 snp = (union sctp_notification*)recvline;10 if (snp->sn_header.sn_type == SCTP_ASSOC_CHANGE) {11 sac = &snp->sn_assoc_change;12 if ((sac->sac_state == SCTP_COMM_UP) ||13 (sac->sac_state == SCTP_RESTART)) {14 num_rem = sctp_getpaddrs(sock_fd, sac->sac_assoc_id, &sar);15 printf("There are %d remote addresses and they are:n", num_rem);16 sctp_print_addresses(sar, num_rem);17 sctp_freepaddrs(sar);18 num_loc = sctp_getladdrs(sock_fd.sac->sac_assoc_id, &sal);19 printf("There are %d local addresses and they are:n", num_loc);20 sctp_print_addresses(sal, num_loc);21 sctp_freeladdrs(sal);
