[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Ошибки при работе с сокетами
SQLite_query
Доброго времени суток, уважаемые форумчане. Не могу сказать, что не знаком с php, но и что являюсь профессионалом утверждать не буду. Не доводилось работать с сокетами именно в php, поэтому меня заинтересовала статья, расположенная по адресу http://i-novice.net/sokety-v-php/. В данной статье описывается принцип создания сервера и клиента на основе сокетов в php.
При создании сервера используются следующие функции:
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/>";
}
?>


Стоит также отметить, что если раскомментировать функцию по установке опций сокета, скрипт отказывается работать, и браузер ничего не выводит. При этом создаётся ощущение, что он пытается что-то загрузить, но ему это не удаётся.

Помогите пожалуйста решить проблему.
Заранее благодарен.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.