<?
set_time_limit(0);
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
if(!$socket)echo socket_strerror(socket_last_error($socket));
else echo 'socket_create - Операция успешна.<br>';
$sockBind = socket_bind($socket,'localhost',3000);
if(!$sockBind)echo socket_strerror(socket_last_error($sockBind));
else echo 'socket_bind - Операция успешна.<br>';
$sockListen = socket_listen($socket);
if(!$sockListen)echo socket_strerror(socket_last_error($sockListen));
else echo 'socket_listen - Операция успешна.<br>';
do
{
$msgsock = socket_accept($socket);
if(!$msgsock)echo socket_strerror(socket_last_error($msgsock));
$msg = "Привет я сервер!!!";
echo "Say to client ($msg) ... ";
socket_write($msgsock, $msg, strlen($msg));
echo "OK\n";
}while(true);
socket_close($socket);
?>
Так же вот скрипт простого клиета:
<?php
header('Content-Type: text/plain;');
error_reporting(E_ALL ^ E_WARNING);
set_time_limit(0);
ob_implicit_flush();
echo "-= Client =-\n\n";
$address = 'localhost';
$port = 3050;
echo 'Create socket ... ';
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0)echo "OK\n";
echo 'Connect socket ... ';
$result = socket_connect($socket, $address, $port);
if ($result !== false)echo "OK\n";
echo 'Server said me: ';
$out = socket_read($socket, 1024);
echo $out."\n";
socket_close($socket);
?>
Проблема в следующем: Когда я первый раз запускаю сервер и клиента - всё работает: клиент получает строку "Привет я сервер!!!", но стоит мне что то изменить в скрипте сервера и запустить его на выполнение ещё раз то на вкладке сервера, в браузере вываливается ошибка:
Warning: socket_bind() [function.socket-bind]: unable to bind address [0]: Обычно разрешается одно использование адреса сокета (протокол/сетевой адрес/порт)
А на вкладке клиента (в браузере всё это запускаю) всё нормально от сервера приходит его ответ "Привет я сервер!!!" ?
Я так понимаю сервер каким то образом продолжает функционировать в фоновом режиме и когда я изменяю его код, получается, что я пытаюсь привязать новый сокет к тому же адресу и к томуже порту. Объясните пожалуйста, кто знает как реально погасить сервер? Что бы потом его можно было опять запускать с теми же параметрами адреса и порта, и таким образом писать его дальше и отлаживать?
Спустя 12 минут, 45 секунд (23.06.2010 - 15:54) tomash написал(а):
moskitos80
Ну так сделайте возможность остановки скрипта извне
Ну так сделайте возможность остановки скрипта извне
Спустя 5 минут, 24 секунды (23.06.2010 - 15:59) moskitos80 написал(а):
Не подскажете, как?
Спустя 9 минут, 28 секунд (23.06.2010 - 16:09) waldicom написал(а):
Как запускается сервак? В коммандной строке?
Спустя 2 минуты, 14 секунд (23.06.2010 - 16:11) tomash написал(а):
Я просто не знаю задумку! Может так?
А с клиента реализовать передачу команд. Ну авторизация там и все дела, это само собой
do
{
$msgsock = socket_accept($socket);
if(!$msgsock)echo socket_strerror(socket_last_error($msgsock));
$msg = "Привет я сервер!!!";
echo "Say to client ($msg) ... ";
socket_write($msgsock, $msg, strlen($msg));
echo "OK\n";
$cmd = socket_read($msgsock, 1024,PHP_NORMAL_READ);
swith ($cmd)
{
case 'quit':
{
die ('Досвиданья!');
}
breake;
}
}while(true);
А с клиента реализовать передачу команд. Ну авторизация там и все дела, это само собой
Спустя 7 минут, 58 секунд (23.06.2010 - 16:19) waldicom написал(а):
Цитата (tomash @ 23.06.2010 - 15:11) |
А с клиента реализовать передачу команд??? Ну авторизация там и все дела, это само собой |
Сервер не должен зависеть от клиента. Я так думаю.
Спустя 3 минуты, 37 секунд (23.06.2010 - 16:23) moskitos80 написал(а):
Спасибо за помощь, буду пробовать варианты с командной строкой и просто передачей команд.
Цитата |
Как запускается сервак? В коммандной строке? |
Сервак пробовал запускать в браузере. С командной строкой я пока не очень дружу.
Спустя 3 минуты, 28 секунд (23.06.2010 - 16:26) tomash написал(а):
waldicom
Согласен. Это так направление думать. Наверное нужно. отдельный служебный порт реализовать на сервере для удаленного администрирования.
Согласен. Это так направление думать. Наверное нужно. отдельный служебный порт реализовать на сервере для удаленного администрирования.
Спустя 1 минута, 33 секунды (23.06.2010 - 16:28) waldicom написал(а):
Цитата (moskitos80 @ 23.06.2010 - 15:23) |
Сервак пробовал запускать в браузере. С командной строкой я пока не очень дружу. smile.gif |
В браузере не покатит. Лучше (если уж решили делать на пхп), запускать такие вещи в консоли, причем сразу в бэкграунд
Спустя 6 минут, 12 секунд (23.06.2010 - 16:34) tomash написал(а):
Цитата (moskitos80 @ 23.06.2010 - 13:23) |
Сервак пробовал запускать в браузере. С командной строкой я пока не очень дружу. |
Спустя 17 часов, 5 секунд (24.06.2010 - 09:34) moskitos80 написал(а):
Цитата |
В браузере не покатит. Лучше (если уж решили делать на пхп), запускать такие вещи в консоли, причем сразу в бэкграунд |
- Спасибо waldicom. После часового мытарства и подвисов системы, пришёл к такому же выводу.
tomash - большое спасибо за ссылку. Я там много для себя полезного нашёл.
Вот только теперь проблема, когда пытаюсь запустить php из командной строки:
C:\webservers\usr\local\php5\php.exe
Ругается:
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/php5/ext\php_gd2.dll' - Не найден указанный модуль.
in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/php5/ext\php_mbstring.dll' - Не найден указанный модуль.
in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/php5/ext\php_mysql.dll' - Не найден указанный модуль.
in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/php5/ext\php_mysqli.dll' - Не найден указанный модуль.
in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/php5/ext\php_pdo_mysql.dll' - Не найден указанный модуль.
in Unknown on line 0
У меня установлен денвер 3, и по ходу дела система не видит динамических библиотек расширений. Кто нибудь знает с денвером вообще возможно работать из ком. строки или лучше поставить php, apache и mysql руками, по отдельности?
Спустя 1 час, 2 минуты, 5 секунд (24.06.2010 - 10:36) waldicom написал(а):
Важно, что у cli свой php.ini и в нем библиотеки должны быть раскоментированы и указаны правильные пути к ним.
_____________
Сложное - просто. Простое сложно.