int socket(int domain, int type, int protocol);
Параметр domain задает домен соединения: выбирает набор протоколов, которые будут использоваться для создания соединения. Такие наборы описаны в <sys/socket.h>. В настоящее время распознаются такие форматы:
Название | Назначение | Страница руководства |
PF_UNIX, PF_LOCAL | Локальное соединение |
unix(7)
|
PF_INET | IPv4 протоколы Интернет |
ip(7)
|
PF_INET6 | IPv6 протоколы Интернет | |
PF_IPX | IPX - протоколы Novell | |
PF_NETLINK | Устройство для взаимодействия с ядром |
netlink(7)
|
PF_X25 | Протокол ITU-T X.25 / ISO-8208 |
x25(7)
|
PF_AX25 | Протокол AX.25 - любительское радио | |
PF_ATMPVC | ATM - доступ к низкоуровневым PVC | |
PF_APPLETALK | Appletalk |
ddp(7)
|
PF_PACKET | Низкоуровневый пакетный интерфейс |
packet(7)
|
Сокет имеет тип type, задающий семантику коммуникации. В настоящее время определены следующие типы:
Некоторые типы сокетов могут быть не включены в определенные наборы протоколов; например, SOCK_SEQPACKET не включен в набор AF_INET.
Параметр protocol задает конкретный протокол, который работает с сокетом. Обычно существует только один протокол, задающий конкретный тип сокета в определенном семействе протоколов, в этом случае protocol может быть определено, как 0. Однако, возможно существование нескольких таких протоколов (в этом случае и используется данный параметр). Номер протокола зависит от используемого ``домена коммуникации'', см.~ protocols(5). См. getprotoent(3), где описано, как соотносить имена протоколов с их номерами.
Сокеты типа SOCK_STREAM являются соединениями полнодуплексных байтовых потоков, похожими на каналы. Они не сохраняют границы записей. Потоковый сокет должен быть в состоянии соединения перед тем, как из него можно будет отсылать данные или принимать их в нем. Соединение с другим сокетом создается с помощью системного вызова connect(2). После соединения данные можно передавать, с помощью системных вызовов read(2) , write(2) или одного из вариантов следующих системных вызовов: send(2) , recv(2). Когда сеанс закончен, выполняется команда close(2). Внепоточные данные могут передаваться, как описано в send(2), а приниматься, как описано в recv(2).
Коммуникационные протоколы, которые реализуют SOCK_STREAM, следят, чтобы данные не были потеряны или дублированы. Если часть данных, для которых имеется место в буфере протокола, не может быть передана за определенное время, соединение считается "мертвым". Когда в сокете включен флаг SO_KEEPALIVE, протокол каким-либо способом проверяет, не отключена ли еще другая сторона. Сигнал SIGPIPE появляется, если процесс посылает или принимает данные, пользуясь "разорванным" потоком; это приводит к тому, что процессы, не обрабатывающие сигнал, завершаются. Сокеты SOCK_SEQPACKET используют те же самые системные вызовы, что и сокеты SOCK_STREAM. Единственное отличие в том, что вызовы read(2) возвращают только запрошенное количество данных, а остальные данные пришедшего пакета не будут учитываться. Границы сообщений во входящих датаграммах сохраняются.
Сокеты SOCK_DGRAM и SOCK_RAW позволяют посылать датаграммы принимающей стороне, заданной при вызове send(2). Датаграммы обычно принимаются с помощью вызова recvfrom(2), который возвращает следующую датаграмму с соответствующим обратным адресом.
SOCK_PACKET - это устаревший тип сокета, позволявший получать необработанные пакеты прямо от драйвера устройства. Используйте вместо него packet(7).
Системный вызов fcntl(2) с аргументом F_SETOWN может использоваться для задания группы процессов, которая будет получать сигнал SIGURG, когда прибывают внепоточные данные; или сигнал SIGPIPE, когда соединение типа SOCK_STREAM неожиданно обрывается. Этот вызов также можно использовать, чтобы задать процесс или группу процессов, которые получают асинхронные уведомления о событиях ввода-вывода с помощью SIGIO. Использование F_SETOWN эквивалентно использованию вызова ioctl(2) с аргументом FIOSETOWN или SIOCSPGRP.
Когда сеть сообщает модулю протокола об ошибке (например, в случае IP, используя ICMP-сообщение), то для сокета устанавливается флаг ожидающей ошибки. Следующая операция этого сокета вернет код ожидающей ошибки. Некоторые протоколы позволяют очереди ошибок в сокете получить детальную информацию об ошибке; см. IP_RECVERR в ip(7).
Операции сокетов контролируются их параметрами. Эти параметры описаны в <sys/socket.h>. Функции setsockopt(2) и getsockopt(2) используются, чтобы установить и получить необходимые параметры соответственно.
Другие ошибки могут быть созданы модулями
протоколов более низкого уровня.
lqВводное Руководство по межпроцессной коммуникации в 4.3 BSDrq (lqAn Introductory 4.3 BSD Interprocess Communication Tutorialrq) перепечатано и называется Дополнительные документы для программиста UNIX, Том~1, (UNIX Programmer's Supplementary Documents Volume~1).
lqРуководство по межпроцессной коммуникации в BSDrq перепечатано и называется Дополнительные документы для программиста UNIX, Том~1, (UNIX Programmer's Supplementary Documents Volume~1).
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |