Готовый перевод Michael J. Donahoo "TCP/IP Sockets in C, 2nd Edition" / Michael J. Donahoo "Программирование TCP/IP сокетов в Си, 2-ое издание": 2.3 Создание и уничтожение сокетов

Внимание! Этот перевод, возможно, ещё не готов, так как модераторы установили для него статус «перевод редактируется»

2.3 Создание и уничтожение сокетов

Для обмена данными по протоколам TCP или UDP, программа начинается с обращения к операционной системе предоставить механизм работы с сокетами.

Функция позволяющая выполнять это - socket(); ее параметры определяют тип сокета который необходимо использовать в программе.

int socket(int domain, int type, int protocol)

Первый параметр определяет пространство адресов, в котором располагается сокет.

Напомним, что Sockets API предоставляют общий интерфейс для большого набора связей; однако, мы заинтересованы только в IPv4 (AF_INET) и IPv6 (AF_INET6).

Обратите внимание, вы можете увидеть что некоторые программы используют PF_xxx вместо AF_xxx

Как правило, это одно и то же, в этом случае они являются взаимозаменяемыми, но это (увы) не гарантируется. [ По правде говоря это совсем не симпатичная часть интерфейса сокетов, и документация здесь так же не помогает]

Второй параметр определяет тип сокета.

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

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

Третий параметр определяет протокол, используемый для передачи данных.

Как для IPv4 так и для IPv6, мы применяем TCP (определяется константой IPPROTO_TCP) для потоковых сокетов или UDP (определяется константой IPPROTO_UDP) для датаграммных сокетов.

Оставляя константу 0 в третем параметре, система определит тип протокола по умолчанию исходя их семейства протокола и типа.

Так как в настоящее время возможно выбрать только один вариант для потоковых сокетов в семействе протоколов TCP/IP, мы могли бы указать 0 вместо того чтобы писать протокол в явном виде.

Когда-нибудь, однако, могут возникнуть иные межконцевые протоколы в семействе Интернет протоколов, которые реализуют похожую семантику.

В этом случае, с указанием 0 с использованием другого протокола результат может быть желательным или нежелательным.

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

Ранее мы говорили что socket() возвращает дескриптор на объект коммуникации.

В Unix-системах это число: положительное, в случае успеха и -1 в случае ошибок.

Положительное значение стоит рассматривать как заполненный дескриптор, подобно файловому дескриптору. (В действительности, это и есть файловый дескриптор взятый из номера, которое вернул open().)

Этот хэндл, который мы называем дескриптором сокета, передается на другие API функции для идентификации механизма работы с сокетами на котором должна быть проведена операция.

Когда приложение завершает работу с сокетом, оно вызывает close(), что делает дескриптор сокета неработоспособным в дальнейшем.

int close(int socket)

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

close() возвращает 0 в случае успеха или −1 в случае неудачи.

Однажды вызвав close(), использование других операций(таких как send() и recv()) к сокету может привести к ошибкам.

Внимание! Этот перевод, возможно, ещё не готов.
Его статус: перевод редактируется

Переведено на Нотабеноиде
http://notabenoid.org/book/29398/100187

Переводчики: BioForceGun, prefer211

Настройки

Готово:

100.00% КП = 1.0