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