При создании сервера используются следующие функции:
socket_create();
socket_bind();
socket_listen();
socket_accept().
В качестве парсера я использую Easyphp 14.1. Если следовать коду, который представлен в статье, скрипт сервера (на практике) зацикливается.
Перечисленные выше функции при возникновении ошибки возвращают FALSE. Однако, в статье проверка результатов функций проходит следующим образом (к примеру):
if (($msgsock = socket_accept($sock)) < 0)
Получается, что при неудачном выполнении функции (возвращаемое значение FALSE), будет выполняться тот блок кода, который должен выполняться при корректной работе функции (возможно, я не прав).
Я немного модифицировал код из статьи (так как он у меня просто зацикливался), и вот что мне выдал браузер:
Расширение загружено
- Сервер
Создание сокета ... Сокет создан - Resource id #2
Привязывание сокета... Ошибка: Обычно разрешается одно использование адреса сокета (протокол/сетевой адрес/порт).
Прослушивание сокета... Ошибка: Получен недопустимый аргумент.
Ожидаем... Ошибка: Получен недопустимый аргумент.
Закрываем соединение... OK
Полный код моего скрипта:
<?php
set_time_limit(0);
ob_implicit_flush();
error_reporting(E_ALL ^ E_WARNING);
if (extension_loaded('sockets')) echo "<b>Расширение загружено<br/><br/></b>";
else echo "<b>Расширение не загружено <br/><br/></b>";
echo "<b>- Сервер <br/><br /></b>";
$address = '127.0.0.1';
$port = 5555;
echo "<b>Создание сокета ...</b> ";
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!is_resource($socket))
echo 'Не могу создать сокет: '. socket_strerror(socket_last_error())."<br/><br/>";
else echo "Сокет создан - ";
if($socket <= 0)
{
echo "Ошибка: ".socket_strerror(socket_last_error())."<br/><br/>";
}
else
{
echo $socket."<br/><br/>"; // глупость, но хотелось посмотреть, что там
}
/*if (!socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1))
echo "Не могу установить опцию на сокете: ". socket_strerror(socket_last_error());
else echo "Опции сокета установлены <br/>";*/
echo "<b>Привязывание сокета... </b>";
$bind = socket_bind($socket, $address, $port);
if($bind <= 0)
{
echo "Ошибка: ".socket_strerror(socket_last_error())."<br/><br/>";
}
else
{
echo "OK <br/><br/>";
}
echo "<b>Прослушивание сокета... </b>";
$listen = socket_listen($socket, 5);
if($listen <= 0)
{
echo "Ошибка: ".socket_strerror(socket_last_error())."<br/><br/>";
}
else
{
echo "OK <br/><br/>";
}
while(true)
{
echo "<b>Ожидаем... </b>";
$accept = socket_accept($socket);
if($accept <= 0)
{
echo "Ошибка: ".socket_strerror(socket_last_error())."<br/><br/>";
break;
}
else
{
echo "OK <br/><br/>";
}
$msg = "Hello, Клиент!";
echo "Отправить клиенту \"".$msg."\"... ";
socket_write($accept, $msg, strlen($msg));
echo "OK <br/><br/>";
while(true)
{
$awr = socket_read($accept, 1024);
if (false === $awr)
{
echo "Ошибка: ".socket_strerror(socket_last_error())."<br/><br/>";
break 2;
}
else
{
if (trim($awr) == "")
break;
else
echo "Клиент сказал: ".$awr."<br/><br/>";
}
if ($awr == 'exit')
{
socket_close($accept);
break 2;
}
echo "Сказать клиенту \"".$msg."\"... ";
socket_write($accept, $awr, strlen($awr));
echo "OK <br/><br/>";
}
}
if (isset($socket))
{
echo "<b>Закрываем соединение... </b>";
socket_close($socket);
echo "OK <br/><br/>";
}
?>
Стоит также отметить, что если раскомментировать функцию по установке опций сокета, скрипт отказывается работать, и браузер ничего не выводит. При этом создаётся ощущение, что он пытается что-то загрузить, но ему это не удаётся.
Помогите пожалуйста решить проблему.
Заранее благодарен.