17.3.1. Создание сокета

17.3.1. Создание сокета

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

#include <sys/socket.h>

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

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

Первый параметр указывает семейство протоколов и, как правило, принимает одно из значений, перечисленных в табл. 17.1.

Следующий параметр type может иметь одно из значений: SOCK_STREAM, SOCK_DGRAM или SOCK_RAW.[119] Здесь SOCK_STREAM указывает потоковый протокол из данного семейства, a SOCK_DGRAM специфицирует дейтаграммный протокол из того же семейства. Параметр SOCK_RAW предоставляет возможность передавать пакеты прямо в драйвер сетевого устройства, что позволяет пользовательским приложениям поддерживать сетевые протоколы, которые не воспринимаются ядром.

Последний параметр устанавливает протокол для использования с учетом всех ограничений, введенных первыми двумя параметрами. Как правило, значение этого параметра равно 0, что позволяет ядру использовать стандартный протокол установленного типа из указанного семейства. В табл. 17.2 перечислены некоторые допустимые протоколы для семейства PF_INET. Стандартными протоколами здесь считаются IPPROTO_TCP (потоковый) и IPPROTO_UDP (дейтаграммный).

Таблица 17.2. Протоколы IP

Протокол Описание IPPROTO_ICMP Internet Control Message Protocol (протокол управляющих сообщений в сети Internet) для IPv4. IPPROTO_ICMPV6 Internet Control Message Protocol (протокол управляющих сообщений в сети Internet) для IPv6. IPPROTO_IPIP Тоннели IPIP IPPROTO_IPV6 Заголовки IPv6. IPPROTO_RAW Пакеты Raw IP. IPPROTO_TCP Transmission Control Protocol (TCP) (протокол управления передачей). IPPROTO_UDP User Datagram Protocol (UDP) (протокол передачи дейтаграмм пользователя).