UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
#include <sys/socket.h>
ssize_t recvmsg(int <i>sockfd</i>, struct msghdr *<i>msg</i>, int <i>flags</i>);
ssize_t sendmsg(int <i>sockfd</i>, struct msghdr *<i>msg</i>, int <i>flags</i>);
<i>Обе функции возвращают: количество прочитанных или записанных байтов в случае успешного выполнения, -1 в случае ошибки</i>
Большинство аргументов обеих функций скрыто в структуре
msghdr
struct msghdr {
void *msg_name; /* адрес протокола */
socklen_t msg_namelen; /* размер адреса протокола */
struct iovec *msg_iov; /* массив буферов */
size_t msg_iovlen; /* количество элементов в массиве msg_iov */
void *msg_control; /* вспомогательные данные: должны быть
выровнены для структуры cmsghdr */
socklen_t msg_controllen; /* размер вспомогательных данных */
int msg_flags; /* флаги, возвращенные функцией recvmsg() */
};
Показанная нами структура msghdr восходит к 4.3BSD Reno и определяется POSIX. Некоторые системы (например, Solaris 2.5) используют более раннюю структуру msghdr, которая появилась в 4.2BSD. У более ранней структуры нет элемента msg_flags, а элементы msg_control и msg_controllen называются msg_accrights и msg_accrightslen. В этой системе поддерживается только одна форма вспомогательных данных — передача дескрипторов файлов (так называемые права доступа). При появлении протоколов OSI в 4.3BSD Reno были добавлены новые формы вспомогательных данных, вследствие чего были обобщены имена элементов структуры.
Элементы
msg_name
msg_namelen
recvfrom
sendto
msg_name
sendmsg
recvmsg
msg
msg_namelen
sendmsg
recvmsg
Элементы
msg_iov
msg_iovlen
iovec
readv
writev
Элементы
msg_control
msg_controllen
msg_controllen
recvmsg
Работая с функциями
recvmsg
sendmsg
flags
msg_flags
msghdr
■ Элемент
msg_flags
recvmsg
recvmsg
flags
msg_flags
recvmsg
■ Элемент
msg_flags
sendmsg
flags
MSG_DONTWAIT
sendmsg
flags
MSG_DONTWAIT
msg_flags
В табл. 14.2 показано, какие флаги проверяются ядром для функций ввода и вывода и какие элементы
msg_flags
recvmsg
sendmsg.msg_flags
Таблица 14.2. Флаги для различных функций ввода-вывода
Флаг | Проверяются функциями send flags sendto flags sendmsg flags | Проверяются функциями recv flags recvfrom flags recvmsg flags | Возвращаются функцией recvmsg msg_flags |
---|---|---|---|
MSG_DONTROUTE | • | ||
MSG_DONTWAIT | • | • | |
MSG_PEEK | • | ||
MSG_WAITALL | • | ||
MSG_EOR | • | ||
MSG_OOB | • | • | • |
MSG_BCAST | • | ||
MSG_MCAST | • | ||
MSG_TRUNC | • | ||
MSG_CTRUNC | • |