UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
29 readbuf = pdapi_recvmsg(sock_fd, &rd_sz,30 (SA*)&cliaddr, &len, &sri, &msg_flags);31 if (readbuf == NULL)32 continue;29-30sri31-3223.4. Уведомления
В разделе 9.14 уже отмечалось, что приложение может подписаться на уведомления, общее количество которых составляет 7 штук. Пока что наше приложение игнорировало все события, за исключением прихода новых данных. В этом разделе приводятся примеры приема и интерпретации уведомлений SCTP о других событиях транспортного уровня. В листинге 23.4 представлена функция, отображающая все получаемые уведомления. Нам придется изменить и код сервера, чтобы разрешить доставку уведомлений обо всех происходящих событиях. Однако сервер не будет использовать получаемые уведомления для чего-либо конкретного.
Листинг 23.4. Функция вывода уведомлений
1 #include "unp.h" 2 void 3 print_notification(char *notify_buf) 4 { 5 union sctp_notification *snp; 6 struct sctp_assoc_change *sac; 7 struct sctp_paddr_change *spc; 8 struct sctp_remote_error *sre; 9 struct sctp_send_failed *ssf;10 struct sctp_shutdown_event *sse;11 struct sctp_adaption_event *ae;12 struct sctp_pdapi_event *pdapi,13 const char *str;14 snp = (union sctp_notification*)notify_buf;15 switch (snp->sn_header.sn_type) {16 case SCTP_ASSOC_CHANGE:17 sac = &snp->sn_assoc_change;18 switch (sac->sac_state) {19 case SCTP_COMM_UP:20 str = "COMMUNICATION UP";21 break;22 case SCTP_COMM_LOST:23 str = "COMMUNICATION LOST";24 break;25 case SCTP_RESTART:26 str = "RESTART";27 break;28 case SCTP_SHUTDOWN_COMP:29 str = "SHUTDOWN COMPLETE";30 break;31 case SCTP_CANT_STR_ASSOC:32 str = "CAN'T START ASSOC";33 break;34 default:35 str = "UNKNOWN";36 break;37 } /* конец ветвления switch (sac->sac_state) */38 printf("SCTP_ASSOC_CHANGE %s, assoc=0x%xn", str,39 (uint32_t)sac->sac_assoc_id);40 break;41 case SCTP_PEER_ADDR_CHANGE:42 spc = &snp->sn_paddr_change;43 switch (spc->spc_state) {44 case SCTP_ADDR_AVAILABLE:45 str = "ADDRESS AVAILABLE";46 break;47 case SCTP_ADDR_UNREACHABLE:48 str = "ADDRESS UNREACHABLE";49 break;50 case SCTP_ADDR_REMOVED:51 str = "ADDRESS REMOVED";52 break;53 case SCTP_ADDR_ADDED:54 str = "ADDRESS ADDED";55 break;56 case SCTP_ADDR_MADE_PRIM:57 str = "ADDRESS MADE PRIMARY";58 break;59 default:60 str = "UNKNOWN";61 break;62 } /* конец ветвления switch (spc->spc_state) */63 printf("SCTP_PEER_ADDR_CHANGE %s, addr=%s, assoc=0x%xn", str,64 Sock_ntop((SA*)&spc->spc_aaddr, sizeof(spc->spc_aaddr)),65 (uint32_t)spc->spc_assoc_id);66 break;67 case SCTP_REMOTE_ERROR:68 sre = &snp->sn_remote_error;69 printf("SCTP_REMOTE_ERROR: assoc=0x%x error=%dn",70 (uint32_t)sre->sre_assoc_id, sre->sre_error);71 break;72 case SCTP_SEND_FAILED:73 ssf = &snp->sn_send_failed;74 printf("SCTP_SEND_FAILED: assoc=0x%x error=%dn",75 (uint32_t)ssf->ssf_assoc_id, ssf->ssf_error);76 break;77 case SCTP_ADAPTION_INDICATION:
