Связывание сокетов с адресами получателей Сразу после создания сокет находится в неподключенном состоянии (unconnected state). Это означает, что сокет не связан с каким-либо адресом внешнего получателя. Для привязки сокета к некоторому постоянному получателю и перевода его в подключенное состояние (connected state) используется функция connect. Таким образом, прежде чем начать передачу данных через надежный потоковый сокет, прикладная программа должна установить соединение с получателем, вызвав функцию connect. Если сокет используется со службами доставки дейтаграмм, не требующих установки соединения с получателем, то функцию connect можно и не вызывать. Однако тогда каждый раз при передаче данных придется указывать адрес получателя. Функция connect имеет следующий синтаксис: connect(сокет, адрес-получателя, длина-адреса)

Параметр сокет представляет собой целочисленный дескриптор сокета, который переводится в подключенное состояние. Параметр адрес-получателя представляет собой адрес структуры сокета, определяющего адрес получателя, к которому необходимо подключить сокет. Параметр длина-адреса определяет длину в байтах адреса получателя. сландо пермь

Принцип работы функции connect зависит от используемых сетевых протоколов. Выбор надежной потоковой службы доставки дейтаграмм из семейства PF_INET предполагает использование протокола TCP. В таких случаях функция connect устанавливает TCP-соединение с получателем и возвращает ошибку, если соединение установить невозможно. В случае использования службы, не требующей установки соединения с получателем, функция connect всего лишь сохраняет адрес получателя локально.

Пересылка данных через сокет

После создания и настройки параметров сокета, прикладная программа может использовать его для передачи данных. Для этой цели существует пять возможных функций: send, sendto, sendmsg, write и writev. Функции send, write и writev можно использовать только с подключенными сокетами, поскольку они не позволяют вызывающей программе указать адрес получателя. Отличия между этими тремя видами функций незначительны. Функция write имеет три параметра: write(сокет, адрес-буфера, длина)

Параметр сокет содержит целочисленный дескриптор сокета (функцию write также можно использовать и с другими типами дескрипторов). Второй параметр (адрес-буфера) задает адрес предназначенных для отсылки данных, а третий параметр (длина) определяет количество пересылаемых байтов. Вызов функции write приостанавливает (блокирует) выполнение текущей программы до тех пор, пока данные не будут полностью переданы (точнее блокировка выполнения программы функцией write происходит только тогда, когда внутренние системные буферы сокета уже заполнены). Подобно большинству системных вызовов функция write возвращает вызвавшей ее программе код ошибки, что позволяет программисту узнать о результате выполнения операции.

Системная функция writev работает наподобие функции write. Но, в отличие от последней, она позволяет прикладной программе передать данные, находящиеся в разных участках памяти без предварительного их копирования в непрерывный участок памяти. Функция writev имеет следующий синтаксис:

writev(сокет, массив-указателей, длина-массива)

Второй аргумент (массив-указателей) задает адрес массива типа iovec. В нем находится список адресов блоков памяти, из которых должно быть сформировано сообщение. Как показано на рис. 22.3, после каждого адреса блока указывается его длина в байтах. Третий аргумент (длина-массива) определяет число записей в массиве iovec.

Функция send имеет следующий синтаксис:

send(сокет, адрес-сообщения, длина-сообщения, флажки)

Здесь параметр сокет определяет дескриптор сокета, через который будут передаваться данные. Второй параметр (адрес-сообщения) определяет адрес предназначенных для отсылки данных, а третий параметр (длина-сообщения) — количество байтов для пересылки. Параметр флажки предназначен для управления процессом передачи. В частности, с помощью специального значения, заданного в виде флажка, отправитель может указать, что сообщение должно быть послано как экстренное через сокет, который поддерживает такую возможность. Вспомните главу 13, "Надежная потоковая транспортная служба (TCP)", в которой говорилось, что экстренные сообщения соответствуют понятию срочных данных в протоколе TCP. Еще одно значение флажка позволяет вызывающей программе послать запрос на пересылку сообщения без использования локальных таблиц маршрутизации. Если процессом маршрутизации управляет вызывающая программа, можно создавать программы для отладки сетевых приложений. Конечно, сокеты поддерживают не все запросы, поступающие от программ. Для некоторых запросов необходимо, чтобы программа располагала особыми привилегиями, а другие просто не поддерживаются во всех сокетах.

С помощью функций sendto и sendmsg вызывающая программа может послать сообщение через неподключенный сокет. Для работы этих функций вызывающая программа должна определить адрес получателя. Функция sendto, которой в качестве параметра передается адрес получателя, имеет следующий синтаксис:

sendto(сокет, адрес-сообщения, длина-сообщения,  флажки, адрес-получателя, длина-адреса)

Первые четыре параметра этой функции аналогичны параметрам, используемым в функции send. Последние два параметра определяют адрес получателя и задают длину этого адреса. Для указания адреса получателя используется структура sockaddr_in, изображенная на рис. 22.2.

Программист может прибегнуть к функции sendmsg в тех случаях, когда использование длинного списка параметров, необходимых для выполнения функции sendto, делает программу неэффективной или трудной для чтения. Функция sendmsg имеет следующий синтаксис:

sendmsg(сокет,  адрес-структуры, флажки)

Здесь параметр адрес-структуры представляет собой адрес структуры, формат которой изображен на рис. 22.4. Структура содержит информацию о пересылаемом сообщении, его длину, адрес получателя, а также длину адреса. Использование этой функции особенно эффективно, поскольку существует соответствующая операция ввода (описанная ниже), с помощью которой создается структура сообщения точно в таком же формате.

Похожие статьи Меню Опрос Фото Популярное
rss