Уильям Стивенс - 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в последнем устанавливается равным нулю.
Интервал:
Закладка: