Man page - bind(2)

Packages contains this manual

Available languages:

en fr es pl tr ja ru zh_TW zh_CN de

Manual

bind

НАИМЕНОВАНИЕ
БИБЛИОТЕКА
ОБЗОР
ОПИСАНИЕ
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
ОШИБКИ
СТАНДАРТЫ
ИСТОРИЯ
ОШИБКИ
ПРИМЕРЫ
СМОТРИТЕ ТАКЖЕ
ПЕРЕВОД

НАИМЕНОВАНИЕ

bind - привязывает имя к сокету

БИБЛИОТЕКА

Стандартная библиотека языка C ( libc , -lc )

ОБЗОР

#include <sys/socket.h>

int bind(int sockfd , const struct sockaddr * addr ,
socklen_t
addrlen );

ОПИСАНИЕ

When a socket is created with socket (2), it exists in a name space (address family) but has no address assigned to it. bind () assigns the address specified by addr to the socket referred to by the file descriptor sockfd . addrlen specifies the size, in bytes, of the address structure pointed to by addr . Traditionally, this operation is called “assigning a name to a socket”.

Обычно, сокету типа SOCK_STREAM нужно назначить локальный адрес с помощью bind () до того, как он сможет принимать соединения (см. accept (2)).

Правила, используемые при привязке имён, отличаются в разных семействах адресов. Подробности см. в соответствующем справочных страницах в разделе 7. Описание AF_INET находится в ip (7), AF_INET6 в ipv6 (7), AF_UNIX в unix (7), AF_APPLETALK в ddp (7), AF_PACKET в packet (7), AF_X25 в x25 (7), а AF_NETLINK в netlink (7).

Реальная структура, передаваемая через addr , зависит от семейства адресов. Структура sockaddr определяется так:

struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
}

Единственным смыслом этой структуры является преобразование указателя структуры, передаваемого в addr , чтобы избежать предупреждений компилятора. См. ПРИМЕРЫ ниже.

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

При успешном выполнении возвращается 0. При ошибке возвращается -1, а в errno содержится код ошибки.

ОШИБКИ

EACCES

Адрес защищён, или пользователь не является суперпользователем.

EADDRINUSE

Указанный адрес уже используется.

EADDRINUSE

(доменные сокеты Интернета) В структуре адреса сокета указан номер порта равный нулю, но при попытке привязаться к эфемеридному порту, было определено, что все номера в диапазоне эфемеридных портов уже используются. Смотрите обсуждение /proc/sys/net/ipv4/ip_local_port_range в ip (7).

EBADF

Значение sockfd не является правильным файловым дескриптором.

EINVAL

Сокет уже привязан к адресу.

EINVAL

Некорректное значение addrlen , или в addr указан некорректный адрес для этого доменного сокета.

ENOTSOCK

Файловый дескриптор sockfd указывает не на каталог.

Следующие ошибки только для сокетов домена UNIX ( AF_UNIX ):

EACCES

Поиск запрещён из-за одного из частей префикса пути (См. также path_resolution (7).)

EADDRNOTAVAIL

Запрошен несуществующий интерфейс или запрашиваемый адрес не является локальным.

EFAULT

addr указывает вне адресного пространства, доступного пользователю.

ELOOP

При определении addr превышено количество переходов по символьной ссылке.

ENAMETOOLONG

Аргумент addr слишком большой.

ENOENT

Компонент из каталожного префикса пути сокета не существует.

ENOMEM

Недостаточное количество памяти ядра.

ENOTDIR

Компонент в префиксе пути не является каталогом.

EROFS

Попытка создания inode сокета на файловой системе, доступной только для чтения.

СТАНДАРТЫ

POSIX.1-2008.

ИСТОРИЯ

POSIX.1-2001, SVr4, 4.4BSD ( bind () впервые появился в 4.2BSD).

ОШИБКИ

Не описываются возможности, связанные с работой прозрачных прокси.

ПРИМЕРЫ

Пример использования bind () с сокетами домена Internet можно найти в getaddrinfo (3).

Следующий пример показывает как привязать потоковый сокет к домену UNIX ( AF_UNIX ) и принимать соединения:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#define MY_SOCK_PATH "/somepath"
#define LISTEN_BACKLOG 50
#define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0)
int
main(void)
{
int sfd, cfd;
socklen_t peer_addr_size;
struct sockaddr_un my_addr, peer_addr;
sfd = socket(AF_UNIX, SOCK_STREAM, 0);
if (sfd == -1)
handle_error("socket");
memset(&my_addr, 0, sizeof(my_addr));
my_addr.sun_family = AF_UNIX;
strncpy(my_addr.sun_path, MY_SOCK_PATH,
sizeof(my_addr.sun_path) - 1);
if (bind(sfd, (struct sockaddr *) &my_addr,
sizeof(my_addr)) == -1)
handle_error("bind");
if (listen(sfd, LISTEN_BACKLOG) == -1)
handle_error("listen");
/* Now we can accept incoming connections one
at a time using accept(2). */
peer_addr_size = sizeof(peer_addr);
cfd = accept(sfd, (struct sockaddr *) &peer_addr,
&peer_addr_size);
if (cfd == -1)
handle_error("accept");
/* Code to deal with incoming connection(s)... */
if (close(sfd) == -1)
handle_error("close");
if (unlink(MY_SOCK_PATH) == -1)
handle_error("unlink");
}

СМОТРИТЕ ТАКЖЕ

accept (2), connect (2), getsockname (2), listen (2), socket (2), getaddrinfo (3), getifaddrs (3), ip (7), ipv6 (7), path_resolution (7), socket (7), unix (7)

ПЕРЕВОД

Русский перевод этой страницы руководства разработал(и) Artyom Kunyov <artkun@guitarplayer.ru>, Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy Ovchinnikov <dmitriyxt5@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, ITriskTI <ITriskTI@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов <pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

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