Member 13072690 Ответов: 1

Может ли PHP-сокет работать при закрытии порта на веб-сервере?


Я предполагаю, что: если порт 2036 закроется на моем веб-сервере. Могу ли я использовать функцию socket_bind($sock, $address, 2036) на PHP-коде? Может ли кто-нибудь объяснить мне этот вопрос?

Что я уже пробовал:

Я перепробовал много портвейна, но он все равно не работает

1 Ответов

Рейтинг:
1

Jochen Arndt

Не совсем понятно, в чем ваша проблема.

Если вы выключаете сервер, обслуживающий определенный порт, и хотите перезапустить его, вы должны соблюдать некоторые правила.

При выключении (закрытии розетки) могут оставаться открытые соединения. Поэтому сервер должен сначала закрыть активные соединения. Затем эти соединения будут находиться в состоянии TIME_WAIT. Это означает, что они закрываются не сразу, а через некоторое время: при получении ACK для FIN send before для указания закрытия или после тайм-аута (по умолчанию 2 * MSL / Maximum Segemnt Time, который по умолчанию составляет 2 минуты). Поэтому на этот раз вам придется подождать, прежде чем привязывать тот же порт к новому сокету, или просто попробовать его (привязка завершится неудачей, пока соединения все еще находятся в состоянии TIME_WAIT).

Но вы можете принудительно игнорировать соединения в состоянии TIME_WAIT, используя флаг сокета SO_REUSEADDR, который должен быть установлен перед привязкой сокета (см. PHP: socket_set_option-руководство пользователя[^]). Этот флаг всегда должен быть установлен для сокетов сервера. Но даже при его использовании вы должны закрыть все соединения и подождать некоторое время, прежде чем закрыть сокет. Мы надеемся, что это закроет большинство соединений с клиентами.