Готовый перевод 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
Настройки
Готово:
