Прежде всего, спасибо, что нашли время, чтобы прочитать это. У меня странная проблема с PHP-сокетами. Я работаю над демоном php socket, который работает через localhost, но когда я пытаюсь подключиться извне локальной сети или другого компьютера, он не работает. Я упростил моего демона до очень простого сокетного соединения, чтобы воспроизвести проблему, которую вы видите.
В основном, вот сенарио. Я запускаю демон сокета на своем сервере через порт 6667. Я могу подключиться к демону через telnet и из браузера на локальной машине, на которой запущен демон, но не могу с любой другой машины - демон даже не видит попытки подключения делается.
Чтобы еще больше усложнить проблему (именно поэтому я думаю, что это проблема переадресации портов), мой провайдер блокирует порт 80, поэтому я настроил dyndns и мой маршрутизатор на использование порта 8000. Я также настроил свой маршрутизатор для пересылки порт 6667 для моего сервера.
Чтобы получить доступ к моему демону из браузера, я ввожу следующий (seudo) URL:
http://mydomain.com:8000/client.php
Это работает с локальной машины и будет подключаться, но с любой другой машины демон даже не увидит попытки подключения. Однако, если я укажу порт следующим образом:
http://mydomain.com:6667
мой демон видит соединение, но, конечно, в браузер не загружена страница клиента, которую пользователь может использовать для взаимодействия с демоном.
Мой клиент использует флэш-файл для создания соединения с сокетом (jsocket), но я знаю, что это не файл междоменной политики, потому что политика правильная, и при подключении через localhost он правильно обслуживает файл политики.
Вот упрощенный код демона:
<?
// set some variables
$host = '0.0.0.0';
$port = 6667;
// don't timeout!
set_time_limit(0);
// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
// bind socket to port
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
// start listening for connections
$result = socket_listen($socket, 3) or die("Could not set up socket listener\n");
// accept incoming connections
// spawn another socket to handle communication
$spawn = socket_accept($socket) or die("Could not accept incoming connection\n");
// read client input
$input = socket_read($spawn, 1024) or die("Could not read input\n");
// clean up input string
$input = trim($input);
// echo input back
$output = $input . "\n";
socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n");
// close sockets
socket_close($spawn);
socket_close($socket);
?>
Резюме:
Я МОГУ подключиться с локального хоста через telnet и браузер ... Я МОГУ подключиться с других машин через telnet, но НЕ МОГУ подключиться с браузера с других машин, используя ip или имя домена, если указан порт 8000. Демон не видит попыток подключения. Если я укажу порт 6667, то демон увидит попытку подключения, но это бесполезно для пользователя. (
Любая помощь в этом вопросе будет принята с благодарностью! Спасибо!