Pull to refresh

Comments 8

Извините, я далёк от веб-разработки, но неужели там нельзя другой порт сконфигурировать? А если у меня запущены две среды, претендующих на один и тот же порт?

Конечно можно. Какая-то новость на пустом месте.

Можно, но при локальной разработке есть некие устоявшиеся обычаи.

Вот в Python, часто запускают дев сервера на порту 8000. Django для примера делает это по умолчанию.

Кажется в nodejs таким портом есть как раз 5000.

И проблема не в том, что его не можно поменять, а в том, что его придется отдельно и специально задавать, а так же то, что по невнимательности можно долго тупить отчего это я вместо моей апишечьки вижу какое-то непонятно что.

Flask точно. Сам столкнулся с этой проблемой. Но просто поменял в коде порт с 5000 на 5001 и все. Мне кажется что новость написана ради "палки" )

Не в курсе, как работают ОС от 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 запоминающиеся адреса без явно указанного порта.

> в Windows и Linux висящие на порту системные службы (которые, как правило, слушают 0.0.0.0) не мешают слушать на том же порту сокет, привязанный к конкретному IP (большинство дев-серверов по умолчанию слушают только 127.0.0.1).

В 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, который и позволяет привязывать несколько сокетов к одному порту.
Также нашёл очень подробный ответ, описывающий тонкости разделения портов в разных ОС.

Sign up to leave a comment.

Other news