UNIX: разработка сетевых приложений
const struct strbuf *<i>dataptr</i>, int <i>flags</i>);<i>Обе функции возвращают: неотрицательное значение в случае успешного выполнения (см. пояснения в тексте), -1 в случае ошибки</i>Обе составляющие сообщения — и сами данные, и управляющая информация — описываются структурой
:strbufstruct strbuf {int maxlen; /* максимальный размер буфера buf */int len; /* фактическое количество данных в buf */char *buf; /* данные */};ПРИМЕЧАНИЕОбратите внимание на аналогию между структурами strbuf и netbuf. Имена элементов обеих структур одинаковы.
Однако обе длины в структуре netbuf относятся к типу данных unsigned int (целое без знака), тогда как обе длины в структуре srtbuf — к типу int (целое со знаком). Причина в том, что некоторые потоковые функции используют значение -1 элементов len и maxlen для указания на определенные специальные ситуации.
С помощью функции
мы можем отправлять или данные, или управляющую информацию, или и то и другое вместе. Для указания на отсутствие управляющей информации мы можем или задатьputmsgкак пустой указатель, или установить значениеctlptrравным -1. Этот же способ используется для указания на отсутствие данных.ctlptr->lenПри отсутствии управляющей информации функцией
генерируется сообщение типаputmsg(см. табл. 31.1), в противном случае генерируется сообщение типаM_DATAлибоM_PROTOв зависимости от значения аргументаM_PCPROTO. Этот аргумент функцииflagsимеет нулевое значение для обычных сообщений, а для сообщений с высоким приоритетом его значение равноputmsg.RS_HIPRIПоследний аргумент функции
имеет тип «значение-результат». Если при вызове функции целочисленное значение, на которое указывает аргументgetmsg, — это 0, то возвращается первое сообщение из потока (которое может быть как обычным, так и имеющим высокий приоритет). Если при вызове функции целочисленное значение соответствуетflagsp, то функция будет ждать появления в головном модуле потока сообщения с высоким приоритетом. В обоих случаях в зависимости от типа возвращенного сообщения значение, на которое указывает аргументRS_HIPRI, будет либо 0, либоflagsp.RS_HIPRIПредположим, что мы передаем функции
непустые указателиgetmsgиctlptr. Тогда указанием на отсутствие управляющей информации (возвращается сообщение типаdataptr) является значениеM_DATA, установленное в -1. Аналогично, если отсутствуют данные, указанием на это является значение -1 элементаctlptr->len.dataptr->lenЕсли функция
выполнилась успешно, то она возвращает нулевое значение, а в случае ошибки возвращается значение -1. Но функцияputmsgвозвращает нулевое значение только в том случае, если вызывающему процессу было доставлено все сообщение целиком. Если буфер, предназначенный для приема управляющей информации, слишком мал, то возвращается значениеgetmsg(о котором заранее известно, что оно является неотрицательным). Аналогично, если буфер для приема данных оказывается слишком мал, возвращается значениеMORECTL. Если же оба эти буфера оказываются слишком малы, то возвращается логическая сумма этих двух флагов.MOREDATA31.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должен иметь значение в пределах от 0 до 255 включительно. Если аргументputpmsgимеет значениеflags, то генерируется сообщение в соответствующей полосе приоритета. Присваивание аргументуMSG_BANDзначенияflagsи задание полосы 0 эквивалентно вызову функции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_BAND (если было прочитано иное сообщение).MSG_HIPRI