[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема с сокетами
Godwarlock
Сервер
<?php 
header('Content-Type: text/plain;');
set_time_limit(0);
ignore_user_abort(true);
ob_implicit_flush();
echo "-= Server =-\n\n";

$NULL = NULL;
$adres = "myhost";
$port = 1024;
$max_clients = 3;
$sockets_clients = array();
$creat = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$rez = true;

echo 'Create socket ... '; //Создаем новый сокет
if(!$creat){
die("socket_create() failed\n") ;
}else{
echo "OK\n";
}

$rez &= @socket_bind($creat, $adres, $port); //Вызываем функцию создания сервера
echo 'Bind socket ... ';
if(!$rez){
die("socket_bind() failed\n") ;
}else{
echo "OK\n";
}

$rez &= @socket_listen($creat); //Выводим список подклоючившихся
echo 'Listen socket ... ';
if(!$rez){
die("socket_listen() failed\n") ;
}else{
echo "OK\n";
}
echo "Accepting of socket ... OK\n";
$abort = false;
$read = array($creat);

while(!$abort){
//echo "OK\n";
$num_changed = socket_select($read, $NULL, $NULL, 0, 10); //Чтение по списку массива и определение их состояния

/* Изменилось что-нибудь? */

if ($num_changed){
/* Изменился ли главный сокет (новое подключение) */
if(in_array($creat, $read)){
if(count($sockets_clients) < $max_clients){ //Если количество клиентов меньше макс. количества
$sockets_clients[]= socket_accept($creat); //Подключаем нового клиента
echo " Connect (" . count($sockets_clients) . " $max_clients clients)\n";
socket_write($sockets_clients[count($sockets_clients)-1], "Hello, Client!", 15);
echo " Say to ".count($sockets_clients)." client: Hello, Client!\n";
}
}

/* Цикл по всем клиентам с проверкой изменений в каждом из них */
foreach($sockets_clients as $key => $client){

/* Новые данные в клиентском сокете? Прочитать и ответить */
if(in_array($client, $read)){
$input = socket_read($client, 1024);
/*Блок отправления данных клиентам*/
for ($i=0; $i<>count($sockets_clients); $i++){
if($sockets_clients[$i]!=$client){

socket_write($sockets_clients[$i],"$input") ;
}
}


/*close socket, if message = bye*/
if($input == 'bye'){
echo var_dump($sockets_clients);
echo "Close socket ... OK\n";
socket_close($creat);
$abort = true;

}


}

}

}



$read = $sockets_clients;
$read[] = $creat;

?>

Клиент на другой платформе. Но не суть. К примеру подключается 2 клиента(с одного адреса, т.к тестирую на локалхосте), из клиента поступает информация и вроде бы все хорошо, но стоит закрыть одного окно с клиентом, а во втором спроцоцировать передачу какой либо информации выводит такие ошибки:
socket_read unable to read to socket line 67
socket_write unable to write to socket line 62
Есть еще такой кусок кода
/*close socket, if message = bye*/                     
if($input == 'bye'){
echo var_dump($sockets_clients);
echo "Close socket ... OK\n";
socket_close($creat);
$abort = true;

}

Если из клиента отправить строку bye, сокет закрывается и сервер перестает работать, после чего уже нельзя подконектится к нему. Разъясните ситуацию, может я чего не понимаю и так, и должно быть?
Быстрый ответ:

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