Уильям Стивенс - UNIX: разработка сетевых приложений
- Название:UNIX: разработка сетевых приложений
- Автор:
- Жанр:
- Издательство:Питер
- Год:2007
- Город:Санкт-Петербург
- ISBN:5-94723-991-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Уильям Стивенс - UNIX: разработка сетевых приложений краткое содержание
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
UNIX: разработка сетевых приложений - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
int sctp_connectx(int sockfd , const struct sockaddr * addrs , int addrcnt );
Возвращает: 0 в случае успешного завершения, -1 в случае ошибки
Функция sctp_connectx
используется для соединения с многоинтерфейсным узлом. При ее вызове мы должны указать адреса собеседника в параметре addrs
(количество адресов определяется параметром addrcnt
). Формат структуры addrs
представлен на рис. 9.3. Стек SCTP устанавливает ассоциацию, используя один или несколько адресов из переданного списка. Все адреса addrs
считаются действующими и подтвержденными.
9.5. Функция sctp_getpaddrs
Функция getpeername
не предназначена для использования протоколом, рассчитанным на работу с многоинтерфейсными узлами. Для сокетов SCTP она способна вернуть лишь основной адрес собеседника. Если нужны все адреса, следует вызывать функцию sctp_getpaddrs
.
#include
int sctp_getpaddrs(int sockfd , sctp_assoc_t id , struct sockadrrd ** addrs );
Возвращает: 0 в случае успешного завершения, -1 в случае ошибки
Аргумент sockfd
представляет собой дескриптор сокета, возвращаемый функцией socket
. Второй аргумент задает идентификатор ассоциации для сокетов типа «один-ко-многим». Для сокетов типа «один-к-одному» этот аргумент игнорируется. addrs
— адрес указателя, который функция sctp_getpaddrs
заполнит упакованным списком адресов, выделив под него локальный буфер (см. рис. 9.3 и листинг 23.12). Для освобождения буфера, созданного sctp_getpaddrs
, следует использовать вызов sctp_freepaddrs
.
9.6. Функция sctp_freepaddrs
Функция sctp_freepaddrs
освобождает ресурсы, выделенные вызовом sctp_getpaddrs
.
#include
void sctp_freepaddrs(struct sockaddr * addrs );
Здесь аргумент addrs
— указатель на массив адресов, возвращаемый sctp_getpaddrs
.
9.7. Функция sctp_getladdrs
Функция sctp_getladdrs
может использоваться для получения списка локальных адресов, относящихся к определенной ассоциации. Эта функция бывает необходима в тех случаях, когда приложению требуется узнать, какие именно локальные адреса оно использует (набор адресов, напомним, может быть произвольным подмножеством всех адресов системы).
#include
int sctp_getladdrs(int sockfd , sctp_assoc_t id , struct sockaddr ** addrs );
Возвращает: количество локальных адресов, помещенных в addrs, или -1 в случае ошибки.
Здесь sockfd
— дескриптор сокета, возвращаемый функцией socket
. Аргумент id
— идентификатор ассоциации для сокетов типа «один-ко-многим». Поле id
игнорируется для сокетов типа «один-к-одному». Параметр представляет собой адрес указателя на буфер, выделяемый и заполняемый функцией sctp_getladdrs
. В этот буфер помещается упакованный список адресов. Структура списка представлена на рис. 9.3 и в листинге 23.12. Для освобождения буфера процесс должен вызвать функцию sctp_freeladdrs
.
9.8. Функция sctp_freeladdrs
Функция sctp_freeladdrs
освобождает ресурсы, выделенные при вызове sctp_getladdrs
.
#include
void sctp_freeladdrs(struct sockaddr * addrs );
Здесь addrs
указывает на список адресов, возвращаемый sctp_getladdrs
.
9.9. Функция sctp_sendmsg
Приложение может управлять параметрами SCTP, используя функцию sendmsg
со вспомогательными данными (см. главу 14). Однако из-за неудобств, связанных с применением вспомогательных данных, многие реализации SCTP предоставляют дополнительный библиотечный вызов (который на самом деле может быть и системным вызовом), упрощающий обращение к расширенным функциям SCTP. Вызов функции должен иметь следующий формат:
ssize_t sctp_sendmsg(int sockfd , const void * msg , size_t msgsz ,
const struct sockaddr * to , socklen_t tolen , uint32_t ppid ,
uint32_t flags , uint16_t stream , uint32_t timetolive ,
uint32_t context );
Возвращает: количество записанных байтов в случае успешного завершения, -1 в случае ошибки
Использование sctp_sendmsg
значительно упрощает отправку параметров, но требует указания большего количества аргументов. В поле sockfd
помещается дескриптор сокета, возвращенный системным вызовом socket. Аргумент msg
указывает на буфер размера msgsz
, содержимое которого должно быть передано собеседнику. В поле tolen
помещается длина адреса, передаваемого через аргумент to
. В поле ppid
помещается идентификатор протокола, который будет передан вместе с порцией данных. Поле flags
передается стеку SCTP. Разрешенные значения этого поля приводятся в табл. 7.5.
Номер потока SCTP указывается вызывающим приложением в аргументе stream
. Процесс может указать время жизни сообщения в миллисекундах в поле lifetime
. Значение 0 соответствует бесконечному времени жизни. Пользовательский контекст, при наличии такового, может быть указан в поле context
. Пользовательский контекст связывает неудачную передачу сообщения (о которой получено уведомление) с локальным контекстом, имеющим отношение к приложению. Например, чтобы отправить сообщение в поток 1 с флагом отправки MSG_PR_SCTP_TTL
, временем жизни равным 1000 мс, идентификатором протокола 24 и контекстом 52, процесс должен сделать следующий вызов:
ret =
sctp_sendmsg(sockfd, data, datasz, &dest, sizeof(dest), 24,
MSG_PR_SCTP_TTL, 1, 1000, 52);
Этот подход значительно проще выделения памяти под необходимые вспомогательные данные и настройки структур, входящих в msghdr
. Обратите внимание, что если функция sctp_sendmsg
реализована через вызов sendmsg
, то поле flags
в последнем устанавливается равным 0.
9.10. Функция sctp_recvmsg
Функция sctp_recvmsg
, подобно sctp_sendmsg
, предоставляет удобный интерфейс к расширенным возможностям SCTP. С ее помощью пользователь может получить не только адрес собеседника, но и поле msg_flags
, которое обычно заполняется при вызове recvmsg
(например, MSG_NOTIFICATION
, MSG_EOR
и так далее). Кроме того, функция дает возможность получить структуру sctp_sndrcvinfo
, которая сопровождает сообщение, считанное в буфер. Обратите внимание, что если приложение хочет получать информацию, содержащуюся в структуре sctp_sndrcvinfo
, оно должно быть подписано на событие sctp_data_io_event
с параметром сокета SCTP_EVENTS
(по умолчанию эта подписка включена).
ssize_t sctp_recvmsg(int sockfd , void * msg , size_t msgsz ,
struct sockaddr * from , socklen_t * fromlen ,
struct sctp_sndrcvinfo * sinfo , int *msg_ flags );
Возвращает, количество считанных байтов в случае успешного завершения, -1 в случае ошибки
По возвращении из этого вызова аргумент msg
оказывается заполненным не более, чем msgsz
байтами данных. Адрес отправителя сообщения помещается в аргумент from
, а размер адреса — в аргумент fromlen
. Флаги сообщения будут помещены в аргумент msg_flags
. Если уведомление sctp_data_io_event
включено (а по умолчанию это так и есть), структура sctp_sndrcvinfo
заполняется подробными сведениями о сообщении. Обратите внимание, что если функция sctp_recvmsg
реализована через вызов recvmsg
, то поле flags
в последнем устанавливается равным нулю.
Интервал:
Закладка: