Читаем Linux API. Исчерпывающее руководство полностью

На аргументах addr и addrlen вызова bind() следует остановиться отдельно. В табл. 52.1 вы можете видеть, что во всех доменах применяются адреса в разных форматах. Например, сокеты домена UNIX задействуют пути к файлам, тогда как в интернет-доменах адрес состоит из IPC-адреса и номера порта. Для каждого домена предусмотрена отдельная структура данных, хранящая адрес сокета. Но ввиду того, что системные вызовы наподобие bind() являются универсальными и охватывают все домены, они должны иметь возможность принимать адреса любых типов. Для этого в программном интерфейсе сокетов объявлена универсальная структура данных, struct sockaddr. Ее единственное назначение — привести различные адреса, использующиеся в разных доменах, к единому типу, который можно передавать в системные вызовы для работы с сокетами. Структура sockaddr обычно имеет следующий вид:

struct sockaddr {

sa_family_t sa_family; /* Семейство адресов (константы вида AF_*) */

char sa_data[14]; /* Адрес сокета (размер зависит от домена) */

};

Эта структура служит шаблоном для всех других хранящих адреса определенных доменов; все они начинаются с поля family, которое соотносится с полем sa_family структуры sockaddr (согласно стандарту SUSv3 тип данных sa_family_t представляет собой целое число). Значения поля family должно быть достаточно для определения размера и формата адреса, хранящегося в остальной части структуры.

В некоторых реализациях UNIX структура sockaddr содержит дополнительное поле sa_len, обозначающее ее общий размер. Стандарт SUSv3 не требует наличия этого поля; к тому же оно не поддерживается программным интерфейсом сокетов в Linux.

Если определить макрос проверки возможностей _GNU_SOURCE, то библиотека glibc будет использовать расширение компилятора gcc для прототипирования системных вызовов в заголовочном файле , исключая тем самым необходимость приведения типов (struct sockaddr *). Однако в портируемых приложениях полагаться на эту возможность нельзя (в других системах компилятор будет выводить соответствующие предупреждения).

52.5. Потоковые сокеты

Принцип работы потоковых сокетов можно объяснить на примере телефонной сети.

1. Системный вызов socket(), создающий сокет, аналогичен подключению телефонного аппарата. Чтобы приложения могли взаимодействовать друг с другом, каждое из них должно создать свой сокет.

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

• Одно приложение делает вызов bind(), чтобы привязать свой сокет к общеизвестному адресу, и затем вызывает listen() для уведомления ядра о своей готовности принимать входящие соединения. Возвращаясь к нашей аналогии: чтобы другие люди могли нам звонить, у нас должен быть телефонный номер, зарегистрированный на АТС.

• Другое приложение устанавливает соединение с помощью вызова connect(), указывая адрес сокета, к которому оно хочет подключиться. Данное действие аналогично набору телефонного номера.

• Затем приложение, вызвавшее listen(), принимает соединение, используя вызов accept(). Это похоже на то, как мы снимаем телефонную трубку, когда слышим звонок. Вызов accept() блокируется, если сделать его до того, как другое приложение выполнит connect() («в ожидании звонка»).

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

Применение системных вызовов для работы с потоковыми сокетами проиллюстрировано на рис. 52.1.

Активные и пассивные сокеты

Потоковые сокеты часто делят на активные и пассивные.

• Сокет, созданный с помощью вызова socket(), по умолчанию является активным. Его можно использовать в вызове connect(), чтобы установить соединение с пассивным. Эта процедура называется активным открытием.

• Пассивным (или слушающим) называется сокет, который в результате вызова listen() способен принимать входящие соединения. Процедура приема входящих соединений называется пассивным открытием.

В большинстве приложений, использующих потоковые сокеты, сервер выполняет пассивное открытие, а клиент — активное. Мы руководствуемся данным правилом в последующих разделах, поэтому приложение, выполняющее активное открытие сокета, будем называть просто клиентом. Аналогично вместо словосочетания приложение, которое выполняет пассивное открытие сокета» будет задействован термин «сервер».

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных
C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных