socket()

Создать конечную точку для связи

Прототип:

#include <sys/types.h>
#include <sys/socket.h>
int socket( int domain,
int type,
int protocol );

Аргументы:

domain
Коммуникационный домен, который необходимо использовать. Выбирает семейство протоколов, которое следует использовать. Эти семейства определены в <sys/socket.h>.
type
Тип сокета, который требуется создать. Это определяет семантику общения. Определенные в настоящее время типы:
SOCK_STREAM
обеспечивает последовательные, надежные, двусторонние потоки байт на основе соединений. Может поддерживаться механизм внеполосной передачи данных.
SOCK_DGRAM
поддерживает датаграммы, которые представляют собой ненадежные сообщения фиксированной (обычно небольшой) максимальной длины, без установления соединения.
SOCK_RAW
обеспечивает доступ к внутренним сетевым протоколам и интерфейсам. Доступен только суперпользователю, этот тип здесь не описывается.
protocol
Конкретный протокол, который требуется использовать с сокетом. Обычно существует только один протокол для поддержки определенного типа сокета в данном семействе протоколов. Но если существует много протоколов, необходимо указать один. Номер протокола, который указывается, относится к домену, в котором будет происходить обмен данными. (см. /etc/protocols в Справочнике по Утилитам).

Библиотека:

libsocket

Описание:

Функция socket() создает конечную точку для связи и возвращает дескриптор.

Сокеты SOCK_STREAM

Сокеты SOCK_STREAM - это полнодуплексные потоки байт, похожие на каналы. Потоковый сокет должен быть в подключенном состоянии до того, как по нему будут отправлены или получены какие-либо данные. Чтобы создать соединение с другим сокетом используется connect().

После подключения сокета можно передавать данные, используя read() и write() или варианты send() и recv(). По завершении сессии могут быть вызваны close(). Внеполосные данные также могут передаваться (как описано в send()) и приниматься (как описано в recv()).

Протоколы связи, используемые для реализации сокета SOCK_STREAM, гарантируют, что данные не будут потеряны или дублированы. Если часть данных, для которой протокол пира имеет буферное пространство, не может быть успешно передана в течение разумного промежутка времени, соединение считается разорванным, и результат таких вызовов будут указывать на ошибку, возвращая -1 и устанавливая errno в ETIMEDOUT.

Сокеты SOCK_DGRAM и SOCK_RAW

С помощью сокетов SOCK_DGRAM и SOCK_RAW датаграммы могут быть отправлены получателям, указанным в вызовах send(). Датаграммы обычно принимаются с помощью recvfrom(), которая возвращает следующую датаграмму с ее адресом возврата.

Вызов ioctl()

Возможно использование функции ioctl() для указания группы процессов, которые будут принимать сигнал SIGURG по мере поступления внеполосных данных. Вызов также может включить оповещения о событиях воода/вывода при помощи значения SIGIO.

Параметры на уровне сокета

Работа сокетов контролируется параметрами на уровне сокетов. Эти параметры определены в файле <sys/socket.h>. Используйте setsockopt() и getsockopt(), чтобы установить и получить параметры.

Возвращаемое значение:

Дескриптор сокета. Если возникла ошибка функция возвращает -1, код ошибки записывается в errno.

Коды ошибок:

EACCES
Отказано в разрешении на создание сокета указанного типа и/или протокола.
EAFNOSUPPORT
Указанное семейство адресов не поддерживается.
EMFILE
Таблица дескрипторов процесса заполнена.
ENFILE
Таблица системных файлов заполнена.
ENOBUFS
Недостаточно доступного буферного пространства. Сокет не может быть создан, пока не будут освобождены достаточные ресурсы.
ENOMEM
Недостаточно памяти.
EPROTONOSUPPORT
Тип протокола или указанный протокол не поддерживается в этом домене.

Классификация:

POSIX 1003.1

Безопасность использования
Точка остановки потока
Да
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Да

Предостережения:

По умолчанию, socket() взаимодействует со стеком TCP/IP, управляющим частью пространства имен /dev/socket. Можно изменить это поведение, установив переменную среды SOCK.

Тематические ссылки:

ICMP6, ICMP, INET6, IP6, IP, IPsec, ROUTE, TCP, UDP, UNIX протоколы

accept(), bind(), close(), connect(), getprotobyname(), getsockname(), getsockopt(), ioctl(), listen(), read(), recv(), select(), send(), shutdown(), socketpair(), write()




Предыдущий раздел: Описание API сетевой библиотеки