Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> php sockets, несколько клиентов 
V
    Опции темы
alligator
Дата 10.9.2011, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 28.1.2004

Репутация: нет
Всего: 1



Добрый день, никак не разберусь почему когда идут подключения с 1 ip то всё нормально как только начинаются подключения с другого адреса, то скрипт перестает нормально делать socket_write =( нормально пишет для первого подключившегося ip, для 2,3 и тд уже не пишет нормально в сокет в чем может быть проблема?
вот код:
Код

$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_set_option($socket, SOL_SOCKET, SO_KEEPALIVE, 1);
//socket_set_nonblock($socket);
socket_set_block ($socket);
    if(($ret = socket_bind($socket, $address, $port)) < 0) 
     { 
         echo "failed to bind socket: ".socket_strerror($ret)."\n"; 
         exit(); 
     }
socket_listen($socket);

socket_getsockname($socket, $addr, $port); 
 print "Server Listening on $addr:$port\n"; 
$counter=0;
while(true){
  if($connection = socket_accept($socket)) { 
      socket_getpeername($connection, $raddr, $rport);  
            print "Received Connection from $raddr:$rport\n";
                 while($packet=socket_read($connection,1024,PHP_BINARY_READ)){ 
                      print "Reading socket....\n";
                       // print $packet;
                         $request=explode("\n",$packet);
                          //print_r($request);
                            $_array=parse_packet($request);// Парсим запрос счетчика
                             $_array_office=change_indications($_array);//Готовим массив для офиса
                                print_r($_array_office);//смотрим
                                      if(stat_to_office($raddress,$ra_port,$_array_office)){//Отправляем статистику для офиса,если хорошо сохраняем к себе и выдаем ответ сенсору
                                            $counter++;
                                            save($_array,$_array_office);// Сохраняем реальные данные для себя
                                           $head=reply($_array);//Проверяем, что это действительно запрос от счетчика
                                   if(is_numeric(socket_write($connection,$head,strlen($head)))){ //Отправляем ответ
                                   print "Reply to counter sent.\n";
                                   }
                                   
                                   print "## Request N-".$counter." #########################################################\n";
                                  // socket_close($connection);
                                            }else{
                                                print "Error from Office :-(\r\n";
                                            }


             }
      } 
}
socket_close($socket);


PM MAIL   Вверх
alligator
Дата 10.9.2011, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 28.1.2004

Репутация: нет
Всего: 1



Сделал так:
Читает хорошо, но не пишет вообще ни одному клиенту в сокет
Код

 $clients=array($socket);

while(true){
    $read=$clients; $write=$read;

    if(socket_select($read,$write,$ex=null,0)<1) continue;

   if(in_array($socket,$read)){
       $clients[]=$connection=socket_accept($socket);
      // socket_write($connection,"Clients:".(count($clients)-1));
             socket_getpeername($connection, $raddr, $rport);  
            print "# ".(count($clients)-1)." # Received Connection from $raddr:$rport\n";
            $key = array_search($socket, $read);
            unset($read[$key]);
            $read[]=$connection;
    continue;
   }

   foreach($read as $read_socket){//foreach 1
       $packet = socket_read($read_socket, 1024, PHP_BINARY_READ);
       socket_getpeername($read_socket, $r);
       print "READ - ".$r."\n";
    if($packet===false){
    $key = array_search($read_socket, $clients);
    unset($clients[$key]);
    echo "client disconnected.\n";
    continue;
    }


$packet = trim($packet);
if (!empty($packet)) {

foreach($write as $send_socket){//foreach 2
    socket_getpeername($send_socket, $w);
       print "WRITE - ".$w."\n";
    if($send_socket==$socket || $send_socket==$read_socket && $r==$w ) continue;
   $request=explode("\n",$packet);
       $_array=parse_packet($request);// Парсим запрос счетчика
       $_array_office=change_indications($_array);//Готовим массив для офиса
        print_r($_array_office);//смотрим
        if(stat_to_office($raddress,$ra_port,$_array_office)){//Отправляем статистику для офиса,если хорошо сохраняем к себе и выдаем ответ сенсору
        $counter++;
        save($_array,$_array_office);// Сохраняем реальные данные для себя
        $head=reply($_array);//Проверяем, что это действительно запрос от счетчика
          if(is_numeric(socket_write($send_socket,$head,strlen($head)))){   print "Reply to 3D-Sensor sent.\n";      
          $key = array_search($send_socket, $clients);
    //print_r($send_socket);
    socket_close($clients[$key]);
    unset($clients[$key]);
    print_r($clients);
          }
         print "## Request N-".$counter." #########################################################\n";
            
                  }
                }
              }
            }
          }
     
socket_close($socket);


Не получается сделать =(
PM MAIL   Вверх
alligator
Дата 14.9.2011, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 28.1.2004

Репутация: нет
Всего: 1



Решено!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0420 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.