Сервер сокетов PHP не реагирует на клиентские подключения в моей учетной записи общего хостинга

В моей учетной записи общего хостинга в каталоге public_html у меня есть файл php, содержащий код для создания сервера сокетов.

<?php
set_time_limit(0);

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);             
$ret = socket_bind($sock, 'localhost', 80);             
$ret = socket_listen($sock);           
$msgsock = socket_accept($sock);

socket_write($msgsock, " hello");
?>

Когда я открываю этот php-файл в браузере или запускаю его как команду, сервер сокетов ожидает подключения клиента, после чего код должен отправить клиенту «привет» и завершить выполнение. Я знаю, что настоящий сервер сокетов должен иметь цикл, чтобы он мог работать правильно, но этот код предназначен только для тестирования. Также в public_html у меня есть php-файл, который является клиентом,

<?php
set_time_limit(0);

$mysocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);             
$result = socket_connect($mysocket, 'localhost', 80);               
if ($result === false) { 
echo "error"; 
} else { 
echo "successfully connected"; 
} 

$input = socket_read($mysocket,1024);
echo $input;
?>

и когда я открываю его в браузере, он успешно подключается к локальному хосту через порт 80, даже если файл сервера php не запущен. Но когда файл сервера php запущен и ожидает подключения клиента, он продолжает работать даже после того, как файл клиента успешно подключился к локальному хосту, хотя и не получил «привет». Когда я пытаюсь сделать то же самое на своем компьютере с помощью сервера apache и запускаю эти файлы с другого компьютера через Интернет, он работает, то есть серверный файл принимает клиента, отправляет «привет» и завершает выполнение. Итак, что может быть причиной того, что сервер сокетов php не реагирует на клиентские подключения в моей учетной записи общего хостинга? заранее спасибо


person user2056564    schedule 21.05.2014    source источник


Ответы (1)


Используйте порт, отличный от 80, для прослушивания. Вероятно, не удается создать сервер, потому что веб-сервер работает на порту 80.

person user3662642    schedule 21.05.2014
comment
На аккаунтах виртуального хостинга разрешено использовать только порты 80 и 443. Кроме того, сервер apache на моем компьютере также работает на портах 80 и 443, и код работает там правильно. И когда я проверяю функции socket_create, socket_bind и socket_listen без использования socket_accept в моей учетной записи хостинга, как это if (($ret = socket_listen($sock)) < 0) { echo "error "; } else { echo "OK "; }, он говорит OK для каждой функции. - person user2056564; 22.05.2014