Код, как опубликовано, должен работать, по крайней мере, здесь. Вы уверены, что нет брандмауэра, препятствующего открытию сокета?
Это не должно иметь большого значения, но при открытии сокета укажите правильный протокол:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
Если это не поможет, попробуйте выполнить цикл, чтобы найти порт прослушивания, который может работать; возможно, порт все еще заблокирован вашими предыдущими попытками.
for ( $port = 1234; $port < 65536; $port++ )
{
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
if ( $result )
{
print "bind succeeded, port=$port\n";
break;
} else {
print "Binding to port $port failed: ";
print socket_strerror(socket_last_error($socket))."\n";
}
}
if ( $port == 65536 ) die("Unable to bind socket to address\n");
Если это решит вашу проблему, вы можете сделать
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
перед привязкой, чтобы сообщить системе, что она должна разрешить повторное использование порта.