Прослушать порт, который уже указан как исходный порт установленного соединения?

Если соединение находится в состоянии ESTABLISHED с локальным адресом 127.0.0.1:45000, может ли локальный процесс связываться и прослушиваться на одном и том же порту 45000 или считать этот порт уже используемым и блокировать запрос привязки?

3 Solutions collect form web for “Прослушать порт, который уже указан как исходный порт установленного соединения?”

bind будет выполнено с errno установленной в EINVAL . Если вы действительно хотите это сделать, вам нужно будет tcpdump или другие средства захвата пакетов, чтобы узнать, что происходит. strace на этом процессе также будет вариантом, наряду с другими диагностиками ядра.

Полная история: «Это зависит от того, что вы имеете в виду». Если вы хотите прослушивать тот же IP-адрес и порт, что и существующая программа, в которой вы не контролируете, тогда, как указывали другие, вам может быть не повезло. Если, однако, вы:

  • Может прослушивать другой IP-адрес или
  • Имейте некоторый контроль над оригинальным приложением

то вы можете быть заинтересованы в остальной части этого сообщения.

Один и тот же порт, другой адрес интернет-протокола (IP)

Когда программа использует системный вызов bind (2) для назначения адреса сокету, этот adddress (в случае сокета AF_INET) указывает как порт, так и IP-адрес. Таким образом, два адреса с одним и тем же портом, но с разными IP-адресами отличаются друг от друга и могут быть назначены отдельно без конфликтов. Например, с помощью socat я могу привязываться к порту 9000 по IP-адресу для моего интерфейса loopback в одной оболочке:

  socat TCP4-LISTEN:9000,bind=127.0.0.1 STDOUT 

и привязать к одному и тому же порту, но на моем внешнем IP-адресе в другом:

 socat TCP4-LISTEN:9000,bind=10.0.2.15 STDOUT 

Оба процесса могут принимать соединения, которые поступают на IP-адрес и порт, который они прослушивают. Обратите внимание, однако, что если кто-то прослушивает адрес wildcar 0.0.0.0, вы не можете привязываться к более конкретному адресу, поскольку первый процесс привязан к каждому IP-адресу в системе.

Тот же порт, тот же IP-адрес

По умолчанию два процесса не могут связывать два разных дескриптора файла с одним и тем же адресом. В Linux попытка сделать это приведет к возврату EADDRINUSE из bind(2) :

 socat TCP4-LISTEN:9000,bind=127.0.0.1 STDOUT 2014/11/07 00:10:13 socat[21202] E bind(3, {AF=2 127.0.0.1:9000}, 16): Address already in use 

Учитывая ваш вопрос и последующие действия, я предполагаю, что у вас нет большого контроля над программой, которая в настоящее время использует ваш желаемый порт. Однако, если вы это сделали, возможно, что один процесс имеет установленное соединение на порту + ipaddress, а другой – по тому же адресу. Например, многие серверные приложения выполняют следующие действия:

  • Имейте основной процесс bind (), listen () и accept () соединение
  • Выполните новый процесс обработки принятого соединения, при этом основной процесс возвращается, чтобы попытаться принять () любые новые входящие соединения.

В этом случае вы увидите дочерний процесс с соединением ESTABLISHED на порту и родительским процессом со словом LISTENing на том же порту.

В самых последних ядрах Linux два полностью несвязанных процесса могут связываться с одним и тем же адресом, используя опцию SO_REUSEPORT. Если процессы устанавливают опцию SO_REUSEPORT в сокете, тогда другие процессы с одинаковым эффективным UID первого процесса могут также установить опцию SO_REUSEPORT и привязать к одному и тому же адресу.

К сожалению, у моей версии socat похоже, есть ошибка, из-за которой трудно дать простой пример TCP; однако я привел короткую и плохо написанную примерную программу ниже. Если вы запустите эту программу как один и тот же пользователь в двух разных оболочках, обе будут связываться () без проблем:

 State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 127.0.0.1:9000 *:* users:(("bind_tcp_reusep",pid=21254,fd=3)) LISTEN 0 128 127.0.0.1:9000 *:* users:(("bind_tcp_reusep",pid=21253,fd=3)) 

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

Следующая статья LWN содержит хороший обзор варианта использования для этой опции:

http://lwn.net/Articles/542629/

Просмотр трафика по установленному соединению

Как упоминал robbat2, если вы хотите следить за существующим трафиком, то tcpdump – лучший выбор.

Пример программы SO_REUSEPORT

 #include <stdio.h> #include <stdlib.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <netinet/tcp.h> #include <string.h> #include <errno.h> int main() { struct sockaddr_in bind_addr; struct sockaddr peer_addr; int optval = 1; int tcp_socket; int err; int addr_len = sizeof(struct sockaddr); memset(&bind_addr, 0, sizeof(struct sockaddr_in)); memset(&peer_addr, 0, sizeof(struct sockaddr)); bind_addr.sin_family = AF_INET; bind_addr.sin_port = htons(9000); if (inet_pton(AF_INET, "127.0.0.1", &(bind_addr.sin_addr)) != 1) { perror("inet_pton"); exit(1); } tcp_socket = socket(AF_INET, SOCK_STREAM, 0); setsockopt(tcp_socket, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval)); err = bind(tcp_socket, (const struct sockaddr *)&bind_addr, sizeof(struct sockaddr)); if (err != 0) { perror("bind failed"); exit(1); } err = listen(tcp_socket, 256); if (err != 0) { perror("listen failed"); exit(1); } accept(tcp_socket, &peer_addr, &addr_len); } 

Просто попробовал это самостоятельно, запустив локальный сервер Tomcat и настроив конфигурацию на привязку к порту, который уже был указан в качестве исходного адреса соединения ESTABLISHED. Это позволило серверу привязываться к порту в состоянии LISTEN, в то время как еще одно соединение ESTABLISHED уже использовало этот порт в качестве локального адреса.

  • Как отказаться от завершения запроса?
  • Можно ли добавить в привилегированные порты Linux?
  • Есть ли способ моделирования высокой задержки?
  • Когда используется сетевой менеджер, OpenSuSe застревает во время загрузки в течение 10 минут
  • Debian, две сетевые карты - «нет маршрута для размещения» на eth1
  • Понимание ifconfig stats
  • Устранение неполадок и отладки сети Linux
  • Нет wlan0 в Ubuntu 10.04
  • Самые дешевые устройства Linux?
  • Два шлюза по умолчанию на Debian Jessie
  • Нет маршрута для размещения через прямой Ethernet, но nmap находит машину
  • Interesting Posts

    Символическая ссылка становится нечитаемой после prctl (PR_SET_DUMPABLE, 0);

    Как извлечь один файл из двух путей в unix?

    Предустановленные окна 8.1 не загружаются после установки Linux mint 17.1

    Несъемная файловая система XFS

    virt-manager error "format = dir: 'dir' недопустимый формат" при создании qemu VM с ISO

    Аудио перестало работать в Xine в Debian

    Простой способ посмотреть, кто в данный момент подключен к моей точке доступа. Linux Network-manger или nmcli

    Использование Rsync для скрытой копии

    Квадратный кронштейн квадратной скобки A ^ [[A – Что это значит?

    Thunar не автомонтирует USB-устройства с настройкой по умолчанию

    wget и curl сохранение веб-страницы в виде тарабарщины (зашифровано?)

    Ctrl + a + d выход терминала?

    Как точно выполнить команды grep?

    CentOS не может монтировать / home, Ошибка получения полномочий: Ошибка инициализации полномочий: Не удалось подключиться: нет такого файла или каталога

    Патрулирование PIDs в kill не работает

    Linux и Unix - лучшая ОС в мире.