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 |
|
|
Для обмена данными по протоколам TCP или UDP, программа начинается с обращения к операционной системе предоставить механизм работы с сокетами. BioForceGun 22.05.12 в 13:50 |
||
|
Функция позволяющая выполнять это - socket(); ее параметры определяют тип сокета который необходимо использовать в программе. BioForceGun 22.05.12 в 13:55 |
||
|
int socket(int domain, int type, int protocol) BioForceGun 22.05.12 в 13:56 |
||
|
Первый параметр определяет пространство адресов, в котором располагается сокет. BioForceGun 22.05.12 в 14:00 |
||
|
Напомним, что Sockets API предоставляют общий интерфейс для большого набора связей; однако, мы заинтересованы только в IPv4 (AF_INET) и IPv6 (AF_INET6). BioForceGun 22.05.12 в 14:02 |
||
|
Обратите внимание, вы можете увидеть что некоторые программы используют PF_xxx вместо AF_xxx BioForceGun 22.05.12 в 14:03 |
||
|
Как правило, это одно и то же, в этом случае они являются взаимозаменяемыми, но это (увы) не гарантируется. [ По правде говоря это совсем не симпатичная часть интерфейса сокетов, и документация здесь так же не помогает] BioForceGun 22.05.12 в 14:07 |
||
|
Второй параметр определяет тип сокета. BioForceGun 22.05.12 в 14:07 |
||
|
Тип определяет способ передачи данных с помощью сокета - например, является ли передача данных надежной, доходит ли сообщение полностью, и т.д. BioForceGun 22.05.12 в 14:10 |
||
|
Константа SOCK_STREAM указывает сокет с надежным каналом передачи данных, в то время как SOCK_DGRAM указывает на сокет в котором передача сообщений происходит в виде отдельных сообщений (датаграмм). BioForceGun 22.05.12 в 14:13 |
||
|
Третий параметр определяет протокол, используемый для передачи данных. BioForceGun 22.05.12 в 14:14 |
||
|
Как для IPv4 так и для IPv6, мы применяем TCP (определяется константой IPPROTO_TCP) для потоковых сокетов или UDP (определяется константой IPPROTO_UDP) для датаграммных сокетов. BioForceGun 22.05.12 в 14:18 |
||
|
Оставляя константу 0 в третем параметре, система определит тип протокола по умолчанию исходя их семейства протокола и типа. BioForceGun 22.05.12 в 14:21 |
||
|
Так как в настоящее время возможно выбрать только один вариант для потоковых сокетов в семействе протоколов TCP/IP, мы могли бы указать 0 вместо того чтобы писать протокол в явном виде. BioForceGun 22.05.12 в 14:25 |
||
|
Когда-нибудь, однако, могут возникнуть иные межконцевые протоколы в семействе Интернет протоколов, которые реализуют похожую семантику. BioForceGun 22.05.12 в 14:35 |
||
|
В этом случае, с указанием 0 с использованием другого протокола результат может быть желательным или нежелательным. BioForceGun 22.05.12 в 15:19 |
||
|
Главное, убедиться что коммуникации программы используют всё тот же межконцевой протокол. BioForceGun 22.05.12 в 15:21 |
||
|
Ранее мы говорили что socket() возвращает дескриптор на объект коммуникации. BioForceGun 22.05.12 в 14:32 |
||
|
В Unix-системах это число: положительное, в случае успеха и -1 в случае ошибок. BioForceGun 22.05.12 в 14:46 |
||
|
Положительное значение стоит рассматривать как заполненный дескриптор, подобно файловому дескриптору. (В действительности, это и есть файловый дескриптор взятый из номера, которое вернул open().) BioForceGun 22.05.12 в 14:52 |
||
|
Этот хэндл, который мы называем дескриптором сокета, передается на другие API функции для идентификации механизма работы с сокетами на котором должна быть проведена операция. BioForceGun 22.05.12 в 15:11 |
||
|
Когда приложение завершает работу с сокетом, оно вызывает close(), что делает дескриптор сокета неработоспособным в дальнейшем. BioForceGun 22.05.12 в 14:40 |
||
|
int close(int socket) BioForceGun 22.05.12 в 14:37 |
||
|
close() сообщает основному стеку протокола инициировать любые меры, необходимые для закрытия связи и освобождения ресурсов связанных с сокетом. BioForceGun 22.05.12 в 14:43 |
||
|
close() возвращает 0 в случае успеха или −1 в случае неудачи. BioForceGun 22.05.12 в 14:37 |
||
|
Однажды вызвав close(), использование других операций(таких как send() и recv()) к сокету может привести к ошибкам. BioForceGun 22.05.12 в 14:38 |
