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).
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Пример: аргументы типа «значение-результат»
Пример: аргументы типа «значение-результат» В листинге 4.2 представлен измененный код из листинга 1.5 (вывод IP-адреса и номера порта клиента), обрабатывающий аргумент типа «значение-результат» функции accept.Листинг 4.2. Сервер определения времени и даты, сообщающий IP-адрес и
3.5 Результат выполнения программы в качестве аргумента
3.5 Результат выполнения программы в качестве аргумента Теперь перейдем от аргументов команд для командного файла к порождению аргументов. Конечно, расширение имен файлов с помощью метасимволов, подобных *, является наиболее типичным способом порождения аргументов
20.1.1 Результат одобрения SNMP в IAB
20.1.1 Результат одобрения SNMP в IAB Первая спецификация SNMP стала начальной точкой. Эксперты из IAB быстро внесли необходимые изменения. Как указано в RFC 1052 (рекомендации по разработке стандартов сетевого управления для Интернета), служба сетевого управления
Результат
Результат После внесения пяти исправлений в модуль оформления заказа общие показатели эффективности магазинов, работающих под руководством сайта, выросли на целых 10 %. «Мы добились настоящего успеха и были просто счастливы», – рассказывает Джейн. Теперь доля заказов,
Значение имеет лишь результат
Значение имеет лишь результат Мы давно вынашивали идею собрать в одном месте действительно гуру инфобизнеса России. Самых настоящих профессионалов и экспертов, которые могли бы поделиться своей уникальной информацией, опытом и навыками не только в области бизнеса,
Разные проекты – разный результат
Разные проекты – разный результат Эта книга наполнена особой энергией: энергией созидания, позитива и успеха. Она содержит слитки ценнейшей информации. Это мы вам гарантируем.Но как именно вы воспользуетесь этими слитками? Здесь никто вам гарантий дать не может. По
Результат здесь и сейчас
Результат здесь и сейчас Для последних 20 % клиентов, относящихся к третьей группе, цена не является приоритетом. Они принимают решение о покупке лишь потому, что у них есть проблема и ее необходимо решить как можно быстрее, здесь и сейчас. Таким клиентам обычно важна
2.1.7. Первый результат
2.1.7. Первый результат После конвертирования базы BIOLIFE.DB, которая содержит много текстовых данных в мемо поле и одно поле, которое мы игнорируем (image field), мы получили следующий результат (обратите внимание на заголовок, который показывает запись 1 из
Привлекательные аргументы
Привлекательные аргументы Аргументы представляют значения, которые предполагается передавать от одной процедуры к другой. Аргументы назначаются процедуре тогда, когда необходимо, чтобы эта процедура изменяла свое поведение в зависимости от тех значений, которые она
Фактические аргументы
Фактические аргументы Фактический аргумент может быть любым значением базового типа, структурой, объединением или указателем. Все фактические аргументы передаются по значению. Массивы и функции не могут быть переданы как параметры, могут передаваться указатели на эти
КАФЕДРА ВАННАХА: Цена и результат
КАФЕДРА ВАННАХА: Цена и результат Автор: Ваннах МихаилПредставители российской элиты (то бишь столичной околотелевизионной тусовки) с увлечением обсуждают проблемы глобализации – благо она для России или угроза. По странному стечению обстоятельств руководителям
Значение SAP R/3
Значение SAP R/3 В оставшейся части этой главы я опишу выдающиеся свойства и преимущества системы SAP R/3 как ERP-системы. Хотя это и не было предметом обсуждения в главе 2 «Оценка ERP» и главе 3 «Выбор ERP», после тщательной оценки и выбора ERP-системы станет ясно, что по всем критериям
Результат переименования
Результат переименования Убедимся, что нам понятен результат этого действия. Пусть класс SANTA_BARBARA имеет вид (оба унаследованных компонента foo в нем переименованы): Рис. 15.13. Устранение конфликта имен(Обратите внимание на графическое обозначение операции смены имен.)