Не могу законнектиться на удаленный сервер.

Discussion in 'PHP' started by mamontenok, 12 Mar 2012.

  1. mamontenok

    mamontenok Banned

    Joined:
    17 Jul 2010
    Messages:
    12
    Likes Received:
    1
    Reputations:
    5
    Ситуация следующая:
    1)на сервере:
    - открыл 8888 порт через брендмауэр вручную
    - Выключил брендмауэр
    - слушаю эту связку 0.0.0.0:8888
    2)на клиенте
    -Отключил брендмауэр вручную
    -делаю коннект к ip_сервера:8888
    3)В результате:
    a) на сервере: read-сокет который выдала фукция stream_select() оказывается c пустым буфером после коннекта клиента.
    б)На клиенте: отваливание сокета после 30 секундного таймаута при коннекте
    Вопрос: Кто или что может блокировать коннект подобным образом?
    Кто нибудь встречал подобную блокировку?
     
  2. Chaak

    Chaak Elder - Старейшина

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
    127.0.0.1
     
  3. mamontenok

    mamontenok Banned

    Joined:
    17 Jul 2010
    Messages:
    12
    Likes Received:
    1
    Reputations:
    5
    нет.

    нет.
     
  4. mamontenok

    mamontenok Banned

    Joined:
    17 Jul 2010
    Messages:
    12
    Likes Received:
    1
    Reputations:
    5
    Еще есть варианты?
     
  5. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    mamontenok Уточните, как именно вы принимаете соединения на сервере. Что происходит между вызовами функции *_bind и stream_select
     
    _________________________
  6. mamontenok

    mamontenok Banned

    Joined:
    17 Jul 2010
    Messages:
    12
    Likes Received:
    1
    Reputations:
    5
    Код сервера:
    PHP:
      echo "<br>Будем ожидать соединения на ".$_POST['ip'].":".$_POST['port'];
      
    $master = array();
      
    $socket stream_socket_server("tcp://".$_POST['ip'].":".$_POST['port'], $errno$errstr);
       if (!
    $socket
        {
         echo 
    "$errstr ($errno)<br />\n";
        } 
       else 
        {
         
    $master[] = $socket;
         
    $read $master;
          while (
    1
           {
            
    $read $master;
            
    $mod_fd stream_select($read$_w NULL$_e NULL5);
             if (
    $mod_fd === FALSE
              {
               break;
              }
             for (
    $i 0$i $mod_fd; ++$i
              {
               if (
    $read[$i] === $socket
                 {
                  
    $conn stream_socket_accept($socket);
                  
    fwrite($conn"Hello! The time is ".date("n/j/Y g:i a")."\n");
                  
    $master[] = $conn;
                 } 
                else 
                 {
                  
    $sock_data fread($read[$i], 1024);
                  
    var_dump($sock_data);
                    if (
    strlen($sock_data) === 0
                     { 
                      
    // connection closed
                      
    $key_to_del array_search($read[$i], $masterTRUE);
                      
    fclose($read[$i]);
                      unset(
    $master[$key_to_del]);
                     } 
                    else
                     {
                      if (
    $sock_data === FALSE)  
                       {
                        echo 
    "Something bad happened";
                        
    $key_to_del array_search($read[$i], $masterTRUE);
                        unset(
    $master[$key_to_del]);
                       } 
                      else 
                       {
                        echo 
    "The client has sent :"var_dump($sock_data);
                        
    fwrite($read[$i], "You have sent :[".$sock_data."]\n");
                        
    fclose($read[$i]);
                        unset(
    $master[array_search($read[$i], $master)]);
                       }
                      }
                  }
    //else
               
    }//for
           
    }//while
        
    }//else
    ?>
    Код клиента:
    PHP:
    <form action="?next=1" method="POST">
     <input type="text" name="ip">ip адрес для коннекта<br>
     <input type="text" name="port">port для коннекта<br>
     <input type="submit" value="Подключиться">
    </form>

    <?php
    if($_GET['next']==1)
     {
      echo 
    "<br>коннектимся к".$_POST['ip'].":".$_POST['port'];
      
    $fp stream_socket_client("tcp://".$_POST['ip'].":".$_POST['port'], $errno$errstr30);
       if (!
    $fp
        {
         echo 
    "$errstr ($errno)<br />\n";
        }
       else 
        {
         
    fwrite($fp"Aloha");
         while (!
    feof($fp)) 
          {
           
    var_dump(fgets($fp1024));
          }
         
    fclose($fp);
        }
     }
    ?>
     
    #6 mamontenok, 12 Mar 2012
    Last edited by a moderator: 12 Mar 2012
  7. mamontenok

    mamontenok Banned

    Joined:
    17 Jul 2010
    Messages:
    12
    Likes Received:
    1
    Reputations:
    5
    Еще добавлю. На одной машине при коннекте на ее внешний ip адрес с нее же , все отлично работает., буфер у сервера оказывается наполненным заголовками если коннект делать через браузер. Если же коннектится с удаленной машины используя тот же самый клиент, то происходит зависалово и после 30 секунд у клиента отваливается сокет по 30 секундному таймауту, а у сервера streaam_select() возвращает всетаки read сокет, но после чтения из него, оказывается что буфер пуст! Ну не чудеса?