Comments 8
Извините, я далёк от веб-разработки, но неужели там нельзя другой порт сконфигурировать? А если у меня запущены две среды, претендующих на один и тот же порт?
Конечно можно. Какая-то новость на пустом месте.
Можно, но при локальной разработке есть некие устоявшиеся обычаи.
Вот в Python, часто запускают дев сервера на порту 8000. Django для примера делает это по умолчанию.
Кажется в nodejs таким портом есть как раз 5000.
И проблема не в том, что его не можно поменять, а в том, что его придется отдельно и специально задавать, а так же то, что по невнимательности можно долго тупить отчего это я вместо моей апишечьки вижу какое-то непонятно что.
Не в курсе, как работают ОС от Apple, но в Windows и Linux висящие на порту системные службы (которые, как правило, слушают 0.0.0.0) не мешают слушать на том же порту сокет, привязанный к конкретному IP (большинство дев-серверов по умолчанию слушают только 127.0.0.1). Соответственно, проблемы возникнут, только если кто-то захочет выставить дев-сервер в сеть, для чего в любом случае придётся лезть в конфиги, а там можно и порт заодно сменить.
К слову, в Windows ещё давно была похожая история, когда Skype занимал порт 80, мешая устанавливать в систему веб-сервера, которые, ожидаемо, из коробки хотели слушать 0.0.0.0, как и сам Skype.
Ещё у меня есть привычка вешать всякие штуки, нужные только локально и настроенные вручную, на дополнительные локальные IP (127.0.0.2 и так далее). Это позволяет избежать потенциальных конфликтов с установленным позже софтом, использующим веб-интерфейс на локальном хосте, а также использовать прописанные в hosts запоминающиеся адреса без явно указанного порта.
В Linux 0.0.0.0 точно мешает всему (от забинживания в другом порядке ничего не меняется).
>>> import socket >>> s1 = socket.socket(); s1.bind(("127.0.0.1", 1337)) >>> s2 = socket.socket(); s2.bind(("192.168.0.247", 1337)) >>> s3 = socket.socket(); s3.bind(("0.0.0.0", 1337)) Traceback (most recent call last): File "<stdin>", line 1, in <module> OSError: [Errno 98] Address already in use
Действительно, этот код работает в Windows без ошибки, но выдаёт ошибку в Linux.
Однако, я ранее использовал для проверки nc -l
и конфликта не возникло. Решил разобраться, почему так и нашёл ответ в исходном коде netcat. Отличие в флаге SO_REUSEPORT, который и позволяет привязывать несколько сокетов к одному порту.
Также нашёл очень подробный ответ, описывающий тонкости разделения портов в разных ОС.
ОС Monterey занимает порты 5000 и 7000, используемые для локальной разработки, под AirPlay