[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Ошибка при вызове функции socket_bind
moskitos80
Привет всем. Случилось мне заняться сетевым программированием и столкнулся я с такой проблемой. Я пишу к примеру такой скрипт примитивного сервера:

<?
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 написал(а):
Спасибо за помощь, буду пробовать варианты с командной строкой и просто передачей команд.
Цитата
Как запускается сервак? В коммандной строке?

Сервак пробовал запускать в браузере. С командной строкой я пока не очень дружу. smile.gif

Спустя 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. После часового мытарства и подвисов системы, пришёл к такому же выводу. biggrin.gif

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 и в нем библиотеки должны быть раскоментированы и указаны правильные пути к ним.


_____________
Сложное - просто. Простое сложно.
Быстрый ответ:

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