Socket linux ��� ���

Socket linux ��� ���

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

ОПИСАНИЕ

Параметр domain задает домен соединения: выбирает набор протоколов, которые будут использоваться для создания соединения. Такие наборы описаны в . В настоящее время распознаются такие форматы:

Название Назначение Страница руководства
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_STREAM Обеспечивает создание двусторонних надежных и последовательных потоков байтов , поддерживающих соединения. Может также поддерживаться механизм
внепоточных данных. SOCK_DGRAM Поддерживает датаграммы (ненадежные сообщения с ограниченной длиной и не поддерживающие соединения). SOCK_SEQPACKET Обеспечивает работу последовательного двустороннего канала для передачи датаграмм
с поддержкой соединений; датаграммы имеют ограниченную длину; от получателя требуется за один раз прочитать целый пакет. SOCK_RAW Обеспечивает доступ к низкоуровневому сетевому протоколу. SOCK_RDM Обеспечивает надежную доставку датаграмм без гарантии, что они будут расположены по порядку. SOCK_PACKET Устарел и не должен использоваться в новых программах; см. packet (7).

Некоторые типы сокетов могут быть не включены в определенные наборы протоколов; например, 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) .

Операции сокетов контролируются их параметрами . Эти параметры описаны в . Функции setsockopt (2) и getsockopt (2) используются, чтобы установить и получить необходимые параметры соответственно.

ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ


НАЙДЕННЫЕ ОШИБКИ

Другие ошибки могут быть созданы модулями
протоколов более низкого уровня.

СООТВЕТСТВИЕ СТАНДАРТАМ


ЗАМЕЧАНИЯ


НАЙДЕННЫЕ ОШИБКИ


СМ. ТАКЖЕ

lqВводное Руководство по межпроцессной коммуникации в 4.3 BSDrq (lqAn Introductory 4.3 BSD Interprocess Communication Tutorialrq) перепечатано и называется Дополнительные документы для программиста UNIX, Том

1 , ( UNIX Programmer’s Supplementary Documents Volume

lqРуководство по межпроцессной коммуникации в BSDrq перепечатано и называется Дополнительные документы для программиста UNIX, Том

1 , ( UNIX Programmer’s Supplementary Documents Volume

Источник

Socket linux ��� ���

Вызов socket(2) создаёт сокет, connect(2) соединяет сокет с удалённым сокетным адресом, bind(2) привязывает сокет к локальному адресу, listen(2) сообщает сокету, что должны приниматься новые соединения, а accept(2) используется для получения нового сокета для нового входящего соединения. Вызов socketpair(2) возвращает два соединённых анонимных сокета (реализовано только для некоторых локальных семейств, например AF_UNIX).

Читайте также:  What is open source code in linux

Вызовы send(2), sendto(2) и sendmsg(2) отправляют данные в сокет, а recv(2), recvfrom(2) и recvmsg(2) принимают данные из сокета. Вызовы poll(2) и select(2) ожидают поступления данных или готовятся к передаче данных. Кроме того, для чтения и записи данных могут использоваться стандартные операции ввода-вывода: write(2), writev(2), sendfile(2), read(2) и readv(2).

Вызов getsockname(2) возвращает адрес локального сокета, а getpeername(2) возвращает адрес удалённого сокета. Вызовы getsockopt(2) и setsockopt(2) используются для установки или считывания параметров протокола или уровня сокетов. Вызов ioctl(2) может быть использован для установки или чтения некоторых других параметров.

Вызов close(2) используется для закрытия сокета. Вызов shutdown(2) закрывает части полнодуплексного сокетного соединения.

Перемещение (seeking), или вызовы pread(2) и pwrite(2) с ненулевой позицией, для сокетов не поддерживается.

Для сокетов возможно создание неблокирующего ввода/вывода путём установки в файловый дескриптор сокета флага O_NONBLOCK с помощью вызова fcntl(2). При этом все блокировавшие раньше операции, будут возвращать EAGAIN (операция должна быть повторена позднее); connect(2) возвратит ошибку EINPROGRESS. Пользователь может подождать наступления различных событий через poll(2) или select(2).

События ввода-вывода
Событие Флаг poll Когда происходит
Чтение POLLIN Поступили новые данные
Чтение POLLIN Установка соединения выполнена (для сокетов, ориентированных на соединение)
Чтение POLLHUP Другая сторона инициировала запрос на разъединение
Чтение POLLHUP Соединение разорвано (только для протоколов, ориентированных на соединение). Если производится запись в сокет, то также посылается сигнал SIGPIPE
Запись POLLOUT Сокет имеет достаточно места в буфере отправки для записи в него новых данных
Чтение/Запись POLLIN|
POLLOUT
Исходящий вызов connect(2) завершён
Чтение/Запись POLLERR Произошла асинхронная ошибка
Чтение/Запись POLLHUP Другая сторона закрыла (shut down) одно направление
Исключение POLLPRI Пришли неотложные данные. При этом посылается сигнал SIGURG

Альтернативе poll(2) и select(2) в ядре существует возможность информировать приложение о событиях с помощью сигнала SIGIO. Для этого необходимо установить с помощью fcntl(2) в файловом дескрипторе сокета флаг O_ASYNC, а также назначить с помощью sigaction(2) корректный обработчик сигнала SIGIO. Смотрите ниже раздел Сигналы.

Структуры адреса сокета

Для передачи сокетного адреса любого типа через программный интерфейс сокетов служит тип struct sockaddr. Целью данного типа является приведение типов сокетных адресов определённого домена к «общему» типу, что позволяет избежать предупреждений компилятора о несовпадении типов в вызовах API сокетов.

Также, программный интерфейс сокетов предоставляет тип данных struct sockaddr_storage. Данный тип удобен для размещения всех поддерживаемых структур сокетных адресов определённого домена; он достаточно большой и имеет корректное выравнивание (в частности, он позволяет хранить сокетные адреса IPv6). Для определения типа сокетного адреса, который хранится в структуре, служит следующее поле:

Структура sockaddr_storage полезна для программ, которые должны работать с сокетными адресами единообразно (например, в программах, использующих одновременно сокетные адреса IPv4 и IPv6).

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

До Linux 3.8, данный параметр сокета можно было устанавливать, но нельзя прочитать с помощью getsockopt(2). Начиная с Linux 3.8 он доступен для чтения. Аргумент optlen должен содержать размер буфера, способного разместить имя устройства; рекомендуемое значение — IFNAMSZ байт. Реальная длина имени устройства возвращается обратно через аргумент optlen.

SO_BROADCAST Задать или считать флаг широковещания. Если он установлен, то через датаграммные сокеты разрешено отправлять пакеты на широковещательный адрес. Этот параметр не действует на потоковые сокеты. SO_BSDCOMPAT Разрешить совместимость по ошибкам с BSD. Используется модулем протокола UDP в Linux версии 2.0 и 2.2. Если включено, то полученные UDP-сокетом ошибки ICMP не будут передаваться пользовательской программе. В последний версиях ядер поддержка этого параметра удалена: в Linux 2.4 он игнорируется, а в Linux 2.6 при использовании в программе для него генерируется предупреждение ядра (printk()). В Linux 2.0 также включён параметр совместимости по ошибкам с BSD и для неструктурированных сокетов (произвольное изменение заголовка, пропуск флага широковещательной передачи), но в Linux 2.2 это было удалено. SO_DEBUG Включить отладку сокета. Разрешено только процессам с мандатом CAP_NET_ADMIN или имеющим нулевой идентификатор эффективного пользователя. SO_DOMAIN (начиная с Linux 2.6.32) Получить доменный сокет в виде целого числа; пример возвращаемого значения: AF_INET6. Подробней смотрите в socket(2). Этот параметр сокета доступен только для чтения. SO_ERROR Получить и очистить ожидающую обработки ошибку сокета. Этот параметр сокета доступен только для чтения. Ожидает целое число. SO_DONTROUTE Не выполнять отправку через шлюз, посылать только на машины, соединенные напрямую. Тот же эффект может быть достигнут путём установки для сокета флага MSG_DONTROUTE во время вызова send(2). В качестве параметра ожидается целочисленный логический флаг. SO_KEEPALIVE Включить отправку «поддерживающих» (keep-alive) сообщений для сокетов, ориентированных на соединение. Ожидается целочисленный логический флаг. SO_LINGER Задать или считать параметр SO_LINGER. Аргументом является структура linger.

Если этот параметр установлен, то close(2) или shutdown(2) не вернут управление до тех пор, пока не будут отправлены все сообщения в очереди сокета или до истечения времени задержки (linger). В противном случае вызовы вернут управление немедленно и закрытие будет произведено в фоновом режиме. Если сокет закрывается как часть вызова exit(2), то задержка всегда происходит в фоновом режиме. SO_MARK (начиная с Linux 2.6.25) Устанавливать метку на каждый пакет, отправленный через сокет (похоже на цель netfilter MARK, но для сокетов). Изменение метки можно использовать для маршрутизации на основе меток не задействуя netfilter или для фильтрации пакетов. Для установки этого параметра требуется мандат CAP_NET_ADMIN. SO_OOBINLINE Если включён этот параметр, то внепоточные данные помещаются непосредственно во входной поток данных. В противном случае внепоточные данные передаются только, если во время приёма установлен флаг MSG_OOB. SO_PASSCRED Включить или выключить приём управляющего сообщения SCM_CREDENTIALS. Подробней смотрите в unix(7). SO_PEEK_OFF (начиная с Linux 3.4) Этот параметр, который пока поддерживается только для сокетов unix(7), устанавливает значение «смещения выборки» (peek offset) для системного вызова recv(2), когда он используется с флагом MSG_PEEK.

Читайте также:  Voz para texto windows

Если этому параметру присваивается отрицательное значение (равен -1 для всех новых сокетов), то действует обычное правило: recv(2) с флагом MSG_PEEK выбирает данные из начала (front) очереди.

Если этому параметру присваивается положительное значение или ноль, то следующая выборка данных из очереди сокета произойдёт по байтовому смещению, определяемому значением этого параметра. В то же время, «смещение выборки» будет увеличено на количество байт, выбранных из очереди, то есть последовательные операции выборки возвращают следующие данные из очереди.

Если данные удалены из начала очереди с помощью вызова recv(2) (или подобного) без флага MSG_PEEK, то «смещение выборки» будет уменьшено на количество удалённых байт. Другими словами, приём данных без флага MSG_PEEK корректирует «смещение выборки» относительно поддерживаемого относительного положения данных в очереди, и последующая выборка возвратит данные, которые были бы получены, если бы данные не удалялись.

Для датаграммных сокетов, если «смещение выборки» указывает в середину пакета, то возвращаемые данные маркируются флагом MSG_TRUNC.

В следующем примере показано использование SO_PEEK_OFF. Предположим, в очереди потокового сокета есть входные данные:

Следующая последовательность вызовов recv(2) выполнила бы то, что описано в комментариях:

SO_PEERCRED Получить учётные данные (credentials) стороннего процесса, соединённого с сокетом. Работает только для соединённых потоковых сокетов AF_UNIX, потоков AF_UNIX и датаграммных сокетных пар, созданных с помощью socketpair(2); смотрите unix(7). Возвращаются данные, которые были действительными на момент вызова connect(2) или socketpair(2). Аргументом является структура ucred; определите макрос тестирования свойств _GNU_SOURCE для получения определения этой структуры из . Данный параметр сокета доступен только для чтения. SO_PRIORITY Установить определяемый протоколом приоритет для всех пакетов, отправляемых из этого сокета. Linux использует это значение для управления сетевыми очередями: пакеты с более высоким приоритетом могут быть обработаны раньше (в зависимости от выбранного для устройства способа постановки в очередь). Установка значения приоритета не из диапазона 0 до 6 требует мандата CAP_NET_ADMIN. SO_PROTOCOL (начиная с Linux 2.6.32) Получить протокол сокета в виде целого числа; пример возвращаемого значения: IPPROTO_SCTP. Подробней смотрите в socket(2). Этот параметр сокета доступен только для чтения. SO_RCVBUF Задать или получить максимальный размер буфера приёма сокета (в байтах). Ядро удваивает это значение (для пространства под учёт ресурсов (bookkeeping overhead)) при установке этого параметра с помощью setsockopt(2), и это удвоенное значение возвращается getsockopt(2). Значение по умолчанию устанавливается через файл /proc/sys/net/core/rmem_default, а максимальное возможное значение устанавливается через файл /proc/sys/net/core/rmem_max. Минимальное (удвоенное) значение для этого параметра равно 256. SO_RCVBUFFORCE (начиная с Linux 2.6.14) С помощью этого параметра сокета привилегированный (CAP_NET_ADMIN) процесс может выполнить ту же работу, что и с помощью SO_RCVBUF, но возможно превысить ограничение rmem_max. SO_RCVLOWAT и SO_SNDLOWAT Задать минимальное количество байт в буфере до которого уровень сокета будет отправлять данные протоколу (SO_SNDLOWAT) или получать их от пользователя (SO_RCVLOWAT). Начальное значение этих двух элементов равно 1. Для SO_SNDLOWAT значение в Linux изменить нельзя (setsockopt(2) завершает выполнение с ошибкой ENOPROTOOPT). Значение для SO_RCVLOWAT можно изменить начиная с Linux версии 2.4. Системные вызовы select(2) и poll(2) пока не учитывают настройку SO_RCVLOWAT в Linux, и помечают сокет как доступный для чтения даже когда доступен только 1 байт данных. Последующее чтение из сокета будет заблокировано до тех пор, пока не будет доступно SO_RCVLOWAT байт. SO_RCVTIMEO и SO_SNDTIMEO Задать время ожидания (при отправке или приёме) до генерации сообщения об ошибке. Аргументом является структура struct timeval. Если вводящая или выводящая функция блокируется на этот период времени, и данные был отправлены или получены, то возвращаемое значение этой функции будет равно количеству переданных данных; если данные не проходили и время ожидания истекло, то возвращается -1 и errno устанавливается в EAGAIN, EWOULDBLOCK или EINPROGRESS (для connect(2)) — также как, если был сокет был заблокирован. Если время ожидания установлено в 0 (по умолчанию), то операция не будет ждать. Время ожидания учитывается только в системных вызовах, которые выполняют ввод-вывод из сокета (например, read(2), recvmsg(2), send(2), sendmsg(2)); время ожидания не учитывается в select(2), poll(2), epoll_wait(2) и подобных. SO_REUSEADDR Указать, что правила проверки адресов, передаваемых с помощью вызова bind(2), должны позволять повторное использование локальных адресов. В случае с сокетами AF_INET это означает, что сокет может быть привязан (bind), за исключением случаев, когда активному слушающему сокету присвоен адрес. Если слушающий сокет привязан к INADDR_ANY с определённым портом, то к этому порту невозможно будет привязать любой локальный адрес. Аргументом является целочисленный логический флаг. SO_REUSEPORT (начиная с Linux 3.9) Разрешить многократную привязку сокета AF_INET или AF_INET6 к одинаковому адресу сокета. Данный параметр должен быть указан на каждом сокете (включая первый сокет) до вызова bind(2). Чтобы предотвратить захват порта все привязки процессов к одному адресу должны иметь один эффективный UID. Данный параметр можно применять к сокетам TCP и UDP.

Читайте также:  Kali linux как удалить каталог

Для сокетов TCP данный параметр позволяет accept(2) распределить нагрузку в многонитиевом сервере, назначая разные слушатели сокета в каждой нити. Это улучшает распределение нагрузки по сравнении с обычными методами, например с одной принимающей нитью accept(2), которая распределяет соединения, или с несколькими нитями, которые конкурируют за accept(2) единого сокета.

Для сокетов UDP использование данного параметра может улучшить распределение входящих датаграмм по нескольким процессам (или нитям) по сравнении с обычным методом с несколькими процессами, которые конкурируют при приёме датаграмм из единого сокета.

SO_RXQ_OVFL (начиная с Linux 2.6.33) Указывает, что к принятым skbs должно быть прикреплено вспомогательное сообщение (cmsg) с беззнаковым 32-битным значением, которое обозначает количество пакетов, отброшенных сокетом между последним принятым пакетом и этим принятым пакетом. SO_SNDBUF Задать или считать максимальный размер буфера отправки сокета (в байтах). Ядро удваивает это значение (для пространства под учёт ресурсов (bookkeeping overhead)) при установке этого параметра с помощью setsockopt(2), и это удвоенное значение возвращается getsockopt(2). Значение по умолчанию устанавливается через файл /proc/sys/net/core/wmem_default, а максимальное возможное значение устанавливается через файл /proc/sys/net/core/wmem_max. Минимальное (удвоенное) значение для этого параметра равно 2048. SO_SNDBUFFORCE (начиная Linux 2.6.14) С помощью этого параметра сокета привилегированный (CAP_NET_ADMIN) процесс может выполнить ту же работу, что и с помощью SO_SNDBUF, но возможно превысить ограничение wmem_max. SO_TIMESTAMP Включить или выключить приём управляющего сообщения SO_TIMESTAMP. Управляющее сообщение метки времени посылается с уровнем SOL_SOCKET, а поле cmsg_data выражено структурой struct timeval, обозначающей время приёма последнего пакета, переданного пользователю в этом вызове. Подробней об управляющих сообщениях смотрите в cmsg(3). SO_TYPE Получить тип сокета в виде целого числа (например, SOCK_STREAM). Этот параметр сокета доступен только для чтения. SO_BUSY_POLL (начиная с Linux 3.11) Задаёт приблизительный интервал в микросекундах для задержки опроса при блокирующем приёме при отсутствии данных. Увеличение этого значения требует мандата CAP_NET_ADMIN. Значение по умолчанию данного параметра управляется через файл /proc/sys/net/core/busy_read.

Значение в файле /proc/sys/net/core/busy_poll определяет как долго select(2) и poll(2) задержат опрос, если они работают с сокетами с установленным SO_BUSY_POLL и отсутствуют события для извещения.

В обоих случаях опрос с задержкой (busy polling) будет завершён только, когда сокет примет все данные из сетевого устройства, которое поддерживает этот параметр.

Хотя опрос с задержкой может уменьшить время ожидания в некоторых приложениях, этим нужно пользоваться с осторожностью, так как его использование увеличит нагрузку на ЦП и энергопотребление.

Сигналы

Если был произведён вызов fcntl(2) с FIOSETOWN или ioctl(2) с SIOCSPGRP, то при появлении событий ввода/вывода посылается сигнал SIGIO. Для определения сокета, в котором произошло событие, в обработчике можно воспользоваться вызовом poll(2) или select(2). Альтернативным способом (в Linux 2.2) является установка сигнала реального времени с помощью вызова fcntl(2) с F_SETSIG; будет вызван обработчик сигнала реального времени и в его структуре siginfo_t поле si_fd будет содержать значение файлового дескриптора. Дополнительная информация приведена в fcntl(2).

В некоторых случаях (например, при наличии доступа нескольких процессов к одному сокету) условие, вызвавшее SIGIO, может исчезнуть на момент обработки процессом сигнала. Если это происходит, то процесс должен подождать сигнала ещё какое-то время, так как Linux снова пошлёт его позже.

Интерфейсы /proc

Вызовы ioctl

SIOCGSTAMP Возвращает структуру struct timeval с меткой времени принятого последнего пакета, переданного пользователю. Это полезно для точного вычисления времени. Описание struct timeval приведено в setitimer(2). Данный ioctl нужно использовать только, если для сокета не задан параметр SO_TIMESTAMP. В противном случае возвращается метка времени последнего пакета, который был получен в то время, когда не был установлен SO_TIMESTAMP, или возвращается ошибка, если такой пакет вообще никогда не принимался (т.е. ioctl(2) возвращает -1 и устанавливает errno равной ENOENT). SIOCSPGRP Назначает процесс или группу процессов, которым будут посылаться сигналы SIGIO или SIGURG по окончании выполнения асинхронной операции или при появлении срочных данных. Аргумент является указателем на pid_t. Если аргумент отрицателен, то сигналы будут посылаться группе процессов c идентификатором, равным абсолютному значению аргумента. Если процесс не имеет мандата CAP_KILL или его эффективный идентификатор не равен нулю, то он может указывать только на себя или свою группу процессов. FIOASYNC Изменяет флаг O_ASYNC для включения или отключения асинхронного режима ввода/вывода сокета. В асинхронном режиме при появлении событий ввода/вывода посылается сигнал SIGIO или сигнал, установленный с помощью F_SETSIG. Аргументом является целочисленный логический флаг. Данная операция аналогична вызову fcntl(2) с установленным флагом O_ASYNC. SIOCGPGRP Возвращает процесс или группу процессов, получающих сигналы SIGIO или SIGURG. Если такой процесс не задан, то возвращается нулевое значение.

Возможные операции fcntl(2):

FIOGETOWN То же, что и вызов ioctl(2) SIOCGPGRP. FIOSETOWN То же, что и вызов ioctl(2) SIOCSPGRP.

ВЕРСИИ

ЗАМЕЧАНИЯ

В Linux разрешено повторное использование порта с параметром SO_REUSEADDR только, когда этот параметр установлен и в программе, уже выполнившей bind(2) и в программе, которая хочет использовать порт. Такое поведение отличается от некоторых реализаций (например, FreeBSD), в которых только последняя программа должна устанавливать параметр SO_REUSEADDR. Обычно, это отличие незаметно, так как, например, в серверных программах всегда устанавливают этот параметр.

Источник

Оцените статью