3.3. Аргументы типа «значение-результат»

3.3. Аргументы типа «значение-результат»

Мы отмечали, что когда структура адреса сокета передается какой-либо из функций сокетов, она всегда передается по ссылке, то есть в качестве аргумента передается указатель на структуру. Длина структуры также передается в качестве аргумента. Но способ, которым передается длина, зависит от того, в каком направлении передается структура: от процесса к ядру или наоборот.

1. Три функции bind, connect и sendto передают структуру адреса сокета от процесса к ядру. Один из аргументов этих функций — указатель на структуру адреса сокета, другой аргумент — это целочисленный размер структуры, как показано в следующем примере:

struct sockaddr_in serv;

/* заполняем serv{} */

connect(sockfd, (SA*)&serv, sizeof(serv));

Поскольку ядру передается и указатель, и размер структуры, на которую он указывает, становится точно известно, какое количество данных нужно скопировать из процесса в ядро. На рис. 3.2 показан этот сценарий.

Рис. 3.2. Структура адреса сокета, передаваемая от процесса к ядру

В следующей главе мы увидим, что размер структуры адреса сокета в действительности имеет тип socklen_t, а не int, но POSIX рекомендует определять socklen_t как uint32_t.

2. Четыре функции accept, recvfrom, getsockname и getpeername передают структуру адреса сокета от ядра к процессу, то есть в направлении, противоположном предыдущему случаю. Этим функциям передается указатель на структуру адреса сокета и указатель на целое число, содержащее размер структуры, как показано в следующем примере:

struct sockaddr_un cli; /* домен Unix */

socklen_t len;

len = sizeof(cli);      /* len - это значение */

getpeername(unixfd, (SA*)&cli, &len);

/* значение len могло измениться */

Причина замены типа для аргумента «длина» с целочисленного на указатель состоит в том, что «длина» эта является и значением при вызове функции (сообщает ядру размер структуры, так что ядро при заполнении структуры знает, где нужно остановиться), и результатом, когда функция возвращает значение (сообщает процессу, какой объем информации ядро действительно сохранило в этой структуре). Такой тип аргумента называется аргументом типа «значение-результат» (value-result argument). На рис. 3.3 представлен этот сценарий.

Рис. 3.3. Структура адреса сокета, передаваемая от ядра к процессу

Пример аргументов типа «значение-результат» вы увидите в листинге 4.2.

Если при использовании аргумента типа «значение-результат» для длины структуры структура адреса сокета имеет фиксированную длину (см. рис. 3.1), то значение, возвращаемое ядром, будет всегда равно этому фиксированному размеру: 16 для sockaddr_in IPv4 и 24 для sockaddr_in6 IPv6. Для структуры адреса сокета переменной длины (например, sockaddr_un домена Unix) возвращаемое значение может быть меньше максимального размера структуры (вы увидите это в листинге 15.2).

ПРИМЕЧАНИЕ

Мы говорили о структурах адресов сокетов, передаваемых между процессом и ядром. Для такой реализации, как 4.4BSD, где все функции сокетов являются системными вызовами внутри ядра, это верно. Но в некоторых реализациях, особенно в System V, функции сокетов являются лишь библиотечными функциями, которые выполняются как часть обычного пользовательского процесса. То, как эти функции взаимодействуют со стеком протоколов в ядре, относится к деталям реализации, которые обычно нас не волнуют. Тем не менее для простоты изложения мы будем продолжать говорить об этих структурах как о передаваемых между процессом и ядром такими функциями, как bind и connect. (В разделе В.1 вы увидите, что реализации System V действительно передают пользовательские структуры адресов сокетов между процессом и ядром, но как часть сообщений потоков STREAMS.)

Существует еще две функции, передающие структуры адресов сокетов: это recvmsg и sendmsg (см. раздел 14.5). Однако при их вызове поле длины не является отдельным аргументом функции, а передается как одно из полей структуры.

В сетевом программировании наиболее общим примером аргумента типа «значение-результат» может служить длина возвращаемой структуры адреса сокета. Вы встретите и другие аргументы типа «значение-результат»:

? Три средних аргумента функции select (раздел 6.3).

? Аргумент «длина» для функции getsockopt (см. раздел 7.2).

? Элементы msg_namelen и msg_controllen структуры msghdr при использовании с функцией recvmsg (см. раздел 14.5).

? Элемент ifc_len структуры ifconf (см. листинг 17.1).

? Первый из двух аргументов длины в функции sysctl (см. раздел 18.4).

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

КАФЕДРА ВАННАХА: Цена и результат

Из книги Журнал «Компьютерра» № 24 от 26 июня 2007 года автора Журнал «Компьютерра»

КАФЕДРА ВАННАХА: Цена и результат Автор: Ваннах МихаилПредставители российской элиты (то бишь столичной околотелевизионной тусовки) с увлечением обсуждают проблемы глобализации – благо она для России или угроза. По странному стечению обстоятельств руководителям


2.1.7. Первый результат

Из книги Интернет решения от доктора Боба автора Сворт Боб

2.1.7. Первый результат После конвертирования базы BIOLIFE.DB, которая содержит много текстовых данных в мемо поле и одно поле, которое мы игнорируем (image field), мы получили следующий результат (обратите внимание на заголовок, который показывает запись 1 из


Результат переименования

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Результат переименования Убедимся, что нам понятен результат этого действия. Пусть класс SANTA_BARBARA имеет вид (оба унаследованных компонента foo в нем переименованы): Рис. 15.13.  Устранение конфликта имен(Обратите внимание на графическое обозначение операции смены имен.)


20.1.1 Результат одобрения SNMP в IAB

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

20.1.1 Результат одобрения SNMP в IAB Первая спецификация SNMP стала начальной точкой. Эксперты из IAB быстро внесли необходимые изменения. Как указано в RFC 1052 (рекомендации по разработке стандартов сетевого управления для Интернета), служба сетевого управления


Результат

Из книги Добавьте в корзину. Ключевые принципы повышения конверсии веб-сайтов автора Айзенберг Джеффри

Результат После внесения пяти исправлений в модуль оформления заказа общие показатели эффективности магазинов, работающих под руководством сайта, выросли на целых 10 %. «Мы добились настоящего успеха и были просто счастливы», – рассказывает Джейн. Теперь доля заказов,


Значение SAP R/3

Из книги Внедрение SAP R/3: Руководство для менеджеров и инженеров автора Кале Вивек

Значение SAP R/3 В оставшейся части этой главы я опишу выдающиеся свойства и преимущества системы SAP R/3 как ERP-системы. Хотя это и не было предметом обсуждения в главе 2 «Оценка ERP» и главе 3 «Выбор ERP», после тщательной оценки и выбора ERP-системы станет ясно, что по всем критериям


Привлекательные аргументы

Из книги VBA для чайников автора Каммингс Стив

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


Фактические аргументы

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

Фактические аргументы Фактический аргумент может быть любым значением базового типа, структурой, объединением или указателем. Все фактические аргументы передаются по значению. Массивы и функции не могут быть переданы как параметры, могут передаваться указатели на эти


Результат здесь и сейчас

Из книги Удвоение продаж в интернет-магазине автора Парабеллум Андрей Алексеевич

Результат здесь и сейчас Для последних 20 % клиентов, относящихся к третьей группе, цена не является приоритетом. Они принимают решение о покупке лишь потому, что у них есть проблема и ее необходимо решить как можно быстрее, здесь и сейчас. Таким клиентам обычно важна


Значение имеет лишь результат

Из книги Денежный поток из Интернета автора Круглов Александр

Значение имеет лишь результат Мы давно вынашивали идею собрать в одном месте действительно гуру инфобизнеса России. Самых настоящих профессионалов и экспертов, которые могли бы поделиться своей уникальной информацией, опытом и навыками не только в области бизнеса,


Разные проекты – разный результат

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

Разные проекты – разный результат Эта книга наполнена особой энергией: энергией созидания, позитива и успеха. Она содержит слитки ценнейшей информации. Это мы вам гарантируем.Но как именно вы воспользуетесь этими слитками? Здесь никто вам гарантий дать не может. По


Пример: аргументы типа «значение-результат»

Из книги Wiki-правительство [Как технологии могут сделать власть лучше, демократию – сильнее, а граждан – влиятельнее] автора Новек Бет

Пример: аргументы типа «значение-результат» В листинге 4.2 представлен измененный код из листинга 1.5 (вывод IP-адреса и номера порта клиента), обрабатывающий аргумент типа «значение-результат» функции accept.Листинг 4.2. Сервер определения времени и даты, сообщающий IP-адрес и


3.5 Результат выполнения программы в качестве аргумента

Из книги Linux Mint и его Cinnamon. Очерки применителя автора Федорчук Алексей Викторович

3.5 Результат выполнения программы в качестве аргумента Теперь перейдем от аргументов команд для командного файла к порождению аргументов. Конечно, расширение имен файлов с помощью метасимволов, подобных *, является наиболее типичным способом порождения аргументов