Какие IP-адреса нельзя привязать к прослушивающему сокету?

Согласно сообщению об ошибке, запущен какой-то другой процесс (вероятно, Apache, но может быть и другой HTTP-сервер), который прослушивает TCP-порт 80.

Первый шаг - определить этот процесс и остановить его.

Второй шаг - либо sudo для запуска perforce, либо su для root, а затем запустить perfoce, настроенный на прослушивание TCP-порта 80. Это необходимо сделать, потому что порты 1024 и ниже считаются "специальными", и только идентификатор пользователя root может открывать сокеты, привязанные к этим номерам портов.

0
24.03.2019, 23:58
1 ответ

Из справочной страницы Linux bind(2):

It is normally necessary to assign a local address using bind() before a SOCK_STREAM socket may receive connections (see accept(2)).

The rules used in name binding vary between address families. Consult the manual entries in Section 7 for detailed information. For AF_INET, see ip(7); for AF_INET6, see ipv6(7); for AF_UNIX, see unix(7); for AF_APPLETALK, see ddp(7); for AF_PACKET, see packet(7); for AF_X25, see x25(7); and for AF_NETLINK, see netlink(7).

А для IPv4 на справочной странице ip(7)говорится:

When a process wants to receive new incoming packets or connections, it should bind a socket to a local interface address using bind(2). In this case, only one IP socket may be bound to any given local (address, port) pair. When INADDR_ANY is specified in the bind call, the socket will be bound to all local interfaces. When listen(2) is called on an unbound socket, the socket is automatically bound to a random free port with the local address set to INADDR_ANY.

Таким образом, может показаться, что для сокетов IPv4 TCP или UDP IP-адрес для привязки должен быть либо INADDR_ANY, либо одним из IP-адресов, назначенных любому из сетевых интерфейсов в локальной системе.

Но там же сказано:

There are several special addresses: INADDR_LOOPBACK (127.0.0.1) always refers to the local host via the loopback device; INADDR_ANY (0.0.0.0) means any address for binding; INADDR_BROADCAST (255.255.255.255) means any host and has the same effect on bind as INADDR_ANY for historical reasons.

Итак, привязка к 255.255.255.255 действительна и имеет тот же эффект, что и 0.0.0.0, но в современных реализациях предпочтительнее 0.0.0.0.

И если вы установите параметр сокета IP_FREEBIND, вы можете привязаться к любому адресу, в предположении, что привязанный -к адресу может появиться на каком-то локальном интерфейсе позднее. Однако до тех пор, пока это действительно не произойдет, сокет, связанный таким образом, может быть не очень полезен.

Linux также имеет параметр сокета SO_BINDTODEVICE, который можно использовать для привязки сокета к определенному сетевому интерфейсу без указания его IP-адреса.

3
28.01.2020, 02:22

Теги

Похожие вопросы