2

Я хочу, чтобы команда nc прослушивала порт TCP, поэтому я сделал:

nc -lv 8888

Затем в другой консоли я проверил, получит ли другая программа, пытающаяся прослушивать этот же порт, тип ошибки « Address already in use », поэтому я снова выполнил ту же команду:

nc -lv 8888

К моему удивлению, вторая команда также преуспела. Исследуя, как две программы могут прослушивать один и тот же порт TCP, я обнаружил, что это возможно, если сокет прослушивания открыт с параметром SO_REUSEPORT , поэтому я предполагаю, что nc использует его.

Как я могу заставить nc запретить другим программам использовать тот же порт? Мне бы хотелось, чтобы он прослушивал порт 8888 и был уверен, что это единственная программа, которая будет прослушивать этот порт.

До сих пор я мог делать то, что я хочу, представляя socat вместе с nc следующим образом:

socat TCP-LISTEN:8888,fork TCP:localhost:4444
nc -lv 4444

Потому что socat запрещает любой другой программе прослушивать тот же порт.

Но возможно ли это сделать только с помощью nc?

1 ответ1

3

Ищем один из исходных кодов netcat netcat.c в методе local_listen :

        ret = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &x, sizeof(x));
        if (ret == -1)
            err(1, NULL);

# if defined(SO_REUSEPORT)
        ret = setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &x, sizeof(x));
        if (ret == -1)
            err(1, NULL);
# endif

Затем, чтобы изменить поведение, вам нужно изменить код.

Однако я провел тест с netcat-openbsd 1.105-7, который является частью Ubuntu Xenial, и кажется, что он собран без определения SO_REUSEPORT. Так как он устанавливает SO_REUSEADDR, но не SO_REUSEPORT (под ядром> 3.9), он работает так, как будто вы ожидаете отказаться от запуска второго экземпляра на том же порту.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .