UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
17-22tpi_connect23-33tpi_readtpi_closeНаша функция
tpi_bindЛистинг 31.3. Функция tpi_bind: связывание локального адреса с точкой доступа
//streams/tpi_bind.c 1 #include "tpi_daytime.h" 2 void 3 tpi_bind(int fd, const void *addr, size_t addrlen) 4 { 5 struct { 6 struct T_bind_req msg_hdr; 7 char addr[128]; 8 } bind_req; 9 struct {10 struct T_bind_ack msg_hdr;11 char addr[128];12 } bind_ack;13 struct strbuf ctlbuf;14 struct T_error_ack *error_ack;15 int flags;16 bind_req.msg_hdr.PRIM_type = T_BIND_REQ;17 bind_req.msg_hdr.ADDR_length = addrlen;18 bind_req.msg_hdr.ADDR_offset = sizeof(struct T_bind_req);19 bind_req.msg_hdr.CONIND_number = 0;20 memcpy(bind_req.addr, addr, addrlen); /* sockaddr_in{} */21 ctlbuf.len = sizeof(struct T_bind_req) + addrlen;22 ctlbuf.buf = (char*)&bind_req;23 Putmsg(fd, &ctlbuf, NULL, 0);24 ctlbuf.maxlen = sizeof(bind_ack);25 ctlbuf.len = 0;26 ctlbuf.buf = (char*)&bind_ack;27 flags = RS_HIPRI;28 Getmsg(fd, &ctlbuf, NULL, &flags);29 if (ctlbuf.len < (int)sizeof(long))30 err_quit("bad length from getmsg");31 switch (bind_ack.msg_hdr.PRIM_type) {32 case T_BIND_ACK:33 return;34 case T_ERROR_ACK:35 if (ctlbuf.len < (int)sizeof(struct T_error_ack))36 err_quit("bad length for T_ERROR_ACK");37 error_ack = (struct T_error_ack*)&bind_ack.msg_hdr;38 err_quit("T_ERROR_ACK from bind (%d, %d)",39 error_ack->TLI_error, error_ack->UNIX_error);40 default:41 err_quit("unexpected message type: %d", bind_ack.msg_hdr.PRlM_type);42 }43 }16-20<sys/tihdr.h>T_bind_reqstruct T_bind_req { long PRIM_type; /* T_BIND_REQ */ long ADDR_length; /* длина адреса */ long ADDR_offset; /* смещение адреса */ unsigned long CONIND_number; /* сообщения о соединении */ /* далее следует адрес протокола для связывания */};Все запросы TPI определяются как структуры, начинающиеся с поля типа
longbind_reqT_bind_reqsockaddr_inМы заполняем структуру
T_bind_reqADDRADDR_offsetT_bind_reqsockaddr_inmemcpybind_reqCONIND_number21-23M_PROTOputmsgbind_req
