UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
const struct strbuf *<i>dataptr</i>, int <i>flags</i>);
<i>Обе функции возвращают: неотрицательное значение в случае успешного выполнения (см. пояснения в тексте), -1 в случае ошибки</i>
Обе составляющие сообщения — и сами данные, и управляющая информация — описываются структурой
strbuf
struct strbuf {
int maxlen; /* максимальный размер буфера buf */
int len; /* фактическое количество данных в buf */
char *buf; /* данные */
};
Обратите внимание на аналогию между структурами strbuf и netbuf. Имена элементов обеих структур одинаковы.
Однако обе длины в структуре netbuf относятся к типу данных unsigned int (целое без знака), тогда как обе длины в структуре srtbuf — к типу int (целое со знаком). Причина в том, что некоторые потоковые функции используют значение -1 элементов len и maxlen для указания на определенные специальные ситуации.
С помощью функции
putmsg
ctlptr
ctlptr->len
При отсутствии управляющей информации функцией
putmsg
M_DATA
M_PROTO
M_PCPROTO
flags
putmsg
RS_HIPRI
Последний аргумент функции
getmsg
flagsp
RS_HIPRI
flagsp
RS_HIPRI
Предположим, что мы передаем функции
getmsg
ctlptr
dataptr
M_DATA
ctlptr->len
dataptr->len
Если функция
putmsg
getmsg
MORECTL
MOREDATA
31.4. Функции getpmsg и putpmsg
Когда с выпуском SVR4 к потоковым системам была добавлена поддержка различных полос приоритета, появились новые варианты функций
getmsg
putmsg
#include <stropts.h>
int getpmsg(int <i>fd</i>, struct strbuf *<i>ctlptr</i>,
struct strbuf *<i>dataptr</i>, int *<i>bandp</i>, int *<i>flagsp</i>);
int putpmsg(int <i>fd</i>, const struct strbuf *<i>ctlptr</i>,
const struct strbuf *<i>dataptr</i>, int <i>band</i>, int <i>flags</i>);
<i>Обе функции возвращают: неотрицательное значение в случае успешного выполнения, -1 в случае ошибки</i>
Аргумент
band
putpmsg
flags
MSG_BAND
flags
MSG_BAND
putmsg
flags
MSG_HIPRI
band
RS_HIPRI
putmsg
Два целочисленных значения, на которые указывают аргументы
bandp
flagsp
getpmsg
flagsp
getpmsg
MSG_HIPRI
MSG_BAND
bandp
MSG_ANY
bandp
flagsp
MSG_HIPRI