Книга: Разработка приложений в среде Linux. Второе издание
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) (протокол передачи дейтаграмм пользователя). |