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

Оглавление
Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

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

prefer211 21.05.12 в 08:21

0

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

BioForceGun 22.05.12 в 13:50

0

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

BioForceGun 22.05.12 в 13:55

0

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

BioForceGun 22.05.12 в 13:56

0

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

BioForceGun 22.05.12 в 14:00

0

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

BioForceGun 22.05.12 в 14:02

0

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

BioForceGun 22.05.12 в 14:03

0

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

BioForceGun 22.05.12 в 14:07

0

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

BioForceGun 22.05.12 в 14:07

0

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

BioForceGun 22.05.12 в 14:10

0

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

BioForceGun 22.05.12 в 14:13

0

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

BioForceGun 22.05.12 в 14:14

0

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

BioForceGun 22.05.12 в 14:18

0

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

BioForceGun 22.05.12 в 14:21

0

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

BioForceGun 22.05.12 в 14:25

0

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

BioForceGun 22.05.12 в 14:35

0

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

BioForceGun 22.05.12 в 15:19

0

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

BioForceGun 22.05.12 в 15:21

0

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

BioForceGun 22.05.12 в 14:32

0

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

BioForceGun 22.05.12 в 14:46

1

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

BioForceGun 22.05.12 в 14:52

0

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

BioForceGun 22.05.12 в 15:11

0

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

BioForceGun 22.05.12 в 14:40

0

int close(int socket)

BioForceGun 22.05.12 в 14:37

0

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

BioForceGun 22.05.12 в 14:43

0

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

BioForceGun 22.05.12 в 14:37

0

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

BioForceGun 22.05.12 в 14:38

1
Минутку...