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

Пример передачи учетных данных приводится в файлах scm_cred_send.c и scm_cred_recv.c внутри подкаталога sockets, которые предоставлены с исходным кодом к данной книге.


57.13.5. Последовательный обмен пакетами

Сокеты с поддержкой последовательного обмена пакетами объединяют в себе возможности потоковых и датаграммных сокетов.

• Как и потоковые сокеты, они ориентированы на работу с соединениями, которые устанавливаются тем же способом — с помощью вызовов bind(), listen(), accept() и connect().

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

• По аналогии с потоковыми сокетами (но в отличие от датаграммных) взаимодействие является надежным. Сообщения передаются адресату без ошибок, в том же порядке, в котором были отправлены, без дубликатов и с гарантией доставки (при условии отсутствия перегрузки сети или системных/программных сбоев).

Сокеты с поддержкой последовательного обмена пакетами создаются путем передачи аргументу type вызова socket() значения SOCK_SEQPACKET.

Изначально в Linux, как и в большинстве других UNIX-систем, не поддерживались сокеты такого типа, вне зависимости от домена. Однако в ядре 2.6.4 появилась поддержка сокетов SOCK_SEQPACKET в домене UNIX.

В интернет-домене эти сокеты поддерживаются исключительно протоколом SCTP (который описан в следующем разделе). То есть в UDP и TCP их поддержка отсутствует.

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


57.13.6. Протоколы транспортного уровня SCTP и DCCP

SCTP и DCCP — относительно новые протоколы транспортного уровня, которые в будущем имеют шанс стать довольно распространенными.

SCTP (от англ. Stream Control Transmission Protocol — «протокол передачи с управлением потоком»; www.sctp.org) является протоколом общего назначения, хотя разрабатывался с упором на обмен телефонными сигналами. В отличие от TCP, он соблюдает границы отдельных сообщений. Одна из его отличительных черт — поддержка многопоточной передачи, что позволяет использовать несколько логических потоков данных в рамках одного соединения.

Протокол SCTP описан в книгах [Stewart & Xie, 2001], [Stevens et al., 2004], а также в документах RFC 4960, 3257 и 3286. Он доступен в Linux, начиная с версии ядра 2.6. Подробные сведения о его реализации можно найти на lksctp.sourceforge.net.

В предыдущих главах, посвященных программному интерфейсу сокетов, мы исходили из того, что потоковые сокеты в интернет-домене работают по протоколу TCP. Но на самом деле для потоковых сокетов существует альтернатива — протокол SCTP, который можно указать следующим образом:

socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP);

Начиная с версии 2.6.14 ядро Linux поддерживает новый датаграммный протокол DCCP (Datagram Congestion Control Protocol). Как и TCP, он предоставляет средства контроля перегрузок (устраняя необходимость в реализации подобных механизмов на уровне приложения), защищающие сеть от перегрузки слишком активной передающей стороной (принцип их работы был рассмотрен в подразделе 54.6.3 при описании протокола TCP). Но, в отличие от TCP (и по аналогии с UDP), протокол DCCP не обеспечивает надежную доставку и упорядоченность пакетов; благодаря этому приложения, которым не нужны такие возможности, могут избежать связанных с ними задержек. Информацию о протоколе DCCP можно найти на www.read.cs.ucla.edu/dccp/ и в документах RFC 4336 и 4340.


57.14. Резюме


В различных ситуациях при выполнении операций ввода/вывода с потоковыми сокетами можно столкнуться с частичным чтением или записью. Мы продемонстрировали реализацию двух функций, readn() и writen(), которые гарантируют чтение или запись всех данных в буфере.

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

Вызовы recv() и send() — аналоги операций read() и write() и могут быть использованы для выполнения ввода/вывода через сокет. Их особенностью является дополнительный аргумент flags, влияющий на различные аспекты ввода/вывода, относящиеся к сокетам.

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

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

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

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

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

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

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

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

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

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

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