UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
33 err_quit("tpi_connect: bad length from getmsg");
34 switch (rcvbuf.type) {
35 case T_OK_ACK:
36 break;
37 case T_ERROR_ACK:
38 if (ctlbuf.len < (int)sizeof(struct T_error_ack))
39 err_quit("tpi_connect: bad length for T_ERROR_ACK");
40 error_ack = (struct T_error_ack*)&rcvbuf;
41 err_quit("tpi_connect: T_ERROR_ACK from conn %d, %d)",
42 error_ack->TLI_error, error_ack->UNIX_error);
43 default:
44 err_quit("tpi connect, unexpected message type: &d", rcvbuf.type);
45 }
46 ctlbuf.maxlen = sizeof(conn_con);
47 ctlbuf.len = 0;
48 ctlbuf.buf = (char*)&conn_con;
49 flags = 0;
50 Getmsg(fd, &ctlbuf, NULL, &flags);
51 if (ctlbuf.len < (int)sizeof(long))
52 err_quit("tpi_connect2: bad length from getmsg");
53 switch (conn_con.msg_hdr.PRIM_type) {
54 case T_CONN_CON:
55 break;
56 case T_DISCON_IND:
57 if (ctlbuf.len < (int)sizeof(struct T_discon_ind))
58 err_quit("tpi_connect2: bad length for T_DISCON_IND");
59 discon_ind = (struct T_discon_ind*)&conn_con.msg_hdr;
60 err_quit("tpi_connect2: T_DISCON_IND from conn (%d)",
61 discon_ind->DISCON_reason);
62 default:
63 err_quit("tpi_connect2: unexpected message type. %d",
64 conn_con.msg_hdr PRIM_type);
65 }
66 }
18-26
T_conn_req
struct T_conn_req {
long PRIM_type; /* T_CONN_REQ */
long DEST_length; /* длина адреса получателя */
long DEST_offset; /* смещение адреса получателя */
long OPT_length; /* длина параметров */
long OPT_offset; /* смещение параметров */
/* затем следуют адреса протокола и параметры соединения */
};
Как и в случае функции
tpi_bind
conn_req
T_conn_req
conn_req
OPT_length
OPT_offset
putmsg
M_PROTO
27-45
getmsg
T_OK_ACK
T_ERROR_ACK
T_primitives
getmsg
struct T_ok_ack {
long PRIM_type; /* T_OK_ACK */
long CORRECT_prim; /* корректный примитив */
};
46-65
T_OK_ACK
T_CONN_CON
struct T_conn_con {
long PRIM_type; /* T_CONN_CON */
long RES_length; /* длина адреса собеседника */
long RES_offset; /* смещение адреса собеседника */
long OPT_length; /* длина параметра */
long OPT_offset; /* смещение параметра */
/* далее следуют адрес протокола и параметры собеседника */
};
Мы снова вызываем функцию
getmsg
M_PROTO
M_PCPROTO
T_CONN_CON
T_DISCON_IND
struct T_discon_ind {
long PRIM_type; /* T_DISCON_IND */