За последние 24 часа нас посетили 19499 программистов и 1610 роботов. Сейчас ищут 922 программиста ...

Проброс трафика с одного порта на другой PHP

Тема в разделе "PHP для новичков", создана пользователем x4b, 4 дек 2014.

  1. x4b

    x4b Новичок

    С нами с:
    4 дек 2014
    Сообщения:
    4
    Симпатии:
    0
    Адрес:
    Ярославль
    Добрый день! Я не очень силен в написании скриптов PHP а уж темболее в stream_socket.

    Задача перед мной стоит следуйщая сервер linux на нем крутититься PHP5
    запущен скрипт РНР с бесконечным циклом создан сервер сокет который слушает порт 8000 и в этойще сети где сервер есть другой комп на который нужно отправить весь трафик приходящий с порта 8000 в порт 8003 другой машины и на оборот принять с 8003 порта другой машины и отправить клиенту который конетился на сервер порта 8000, что то типа порт maping.
    знаю что можно сделать другими средствами, но нужно именно на РНР в большей части чтобы смотреть и вслучаи чего править header-ы. Если кто может помочь очень прошу! В долгу не останусь могу оплатить работу конечно в пределах разумного. спасибо! Ниже то что я накалякал.
    Код (Text):
    1.  
    2. <?php
    3.  
    4. $socket = stream_socket_server("tcp://99.99.99.99:8000", $errno, $errstr); //сокет сервера
    5.  
    6. if (!$socket) {
    7.     die("$errstr ($errno)\n");
    8. }
    9.  
    10. $connects = array();
    11.  
    12. while (true) {
    13.     //формируем массив прослушиваемых сокетов:
    14.     $read = $connects;
    15.     $read []= $socket;
    16.     $write = $except = null;
    17.    
    18.     $fp_read = $fp_connects;
    19.     $fp_read []= $fp;
    20.     $fp_write = $fp_except = null;
    21.  
    22.     if (!stream_select($read, $write, $except, null)) {//ожидаем сокеты доступные для чтения (без таймаута)
    23.         break;
    24.     }
    25.  
    26.     if (in_array($socket, $read)) {//есть новое соединение
    27.         $connect = stream_socket_accept($socket, -1);//принимаем новое соединение
    28.         $connects[] = $connect;//добавляем его в список необходимых для обработки
    29.         unset($read[ array_search($socket, $read) ]);
    30.     }
    31.     $fp = stream_socket_client("tcp://192.168.0.1:8003", $errno, $errstr, 30, STREAM_CLIENT_ASYNC_CONNECT); //клиент куда нужно подключаться и отправлять данные и принимать обратно и отправлять в 99.99.99.99:8000
    32.     foreach($read as $connect) {//обрабатываем все соединения
    33.         $headers = '';
    34.        
    35.         while ($buffer = rtrim(fgets($connect))) {
    36.             $headers .= $buffer."\r\n";
    37.             //fwrite($connect, fgets($fp));
    38.         }
    39.  
    40.         //echo $headers."\r\n";
    41.        
    42.         $headers = '';
    43.         while ($buffer = rtrim(fgets($fp))) {
    44.             $headers .= $buffer."\r\n";
    45.                
    46.         }
    47.         //fwrite($connect, $headers."\r\n");
    48.         //if
    49.         echo $headers;
    50.         //}
    51.         //fclose($fp);
    52.         }
    53.        
    54.         //echo $headers;
    55.        
    56.         //fclose($connect);
    57.         unset($connects[ array_search($connect, $connects) ]);
    58.     }
    59.  
    60. }
    61.  
    62.  
    63.  
    64.  
    65.  
    66.  
    67. ?>
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    пхп не предназначен для написания прокси-серверов. для этого есть специализированный софт.
    но если надо извращений - принимаем на сокете подключение, форкаемся дабы иметь возможность обслуживать многократные подключения без залипания в очередь, подключаемся к бэкэнду, вычитываем входной поток в сокет бэкэнда, вычитываем ответ бэкэнда в свой выходной поток. соответственно на чтение из-в и нужно поставить требуемую прослойку работы с заголовками.
     
  3. x4b

    x4b Новичок

    С нами с:
    4 дек 2014
    Сообщения:
    4
    Симпатии:
    0
    Адрес:
    Ярославль
    дружище спасибо тебе огромное но я не профи некоторые слова для меня непонятны =) если можно примерным куском кода или последовательностью буду признателен.

    Добавлено спустя 10 минут 39 секунд:
    на данный момент получилось чтото вроде этого только клиент подключающийся на 8000 порт постояно реконет делает
    Код (Text):
    1.  
    2. <?php
    3.  
    4. $socket = stream_socket_server("tcp://99.99.99.99:8000", $errno, $errstr);
    5.  
    6. if (!$socket) {
    7.     die("$errstr ($errno)\n");
    8. }
    9.  
    10. $connects = array();
    11.  
    12. while (true) {
    13.     //формируем массив прослушиваемых сокетов:
    14.     $read = $connects;
    15.     $read []= $socket;
    16.     $write = $except = null;
    17.    
    18.     if (!stream_select($read, $write, $except, null)) {//ожидаем сокеты доступные для чтения (без таймаута)
    19.         break;
    20.     }
    21.  
    22.     if (in_array($socket, $read)) {//есть новое соединение
    23.         $connect = stream_socket_accept($socket, -1);//принимаем новое соединение
    24.         $connects[] = $connect;//добавляем его в список необходимых для обработки
    25.         unset($read[ array_search($socket, $read) ]);
    26.     }
    27.    
    28.     foreach($read as $connect) {//обрабатываем все соединения
    29.         $fp[$connect] = stream_socket_client("tcp://192.168.0.1:8003", $errno, $errstr, 30, STREAM_CLIENT_ASYNC_CONNECT);
    30.         $headers = '';
    31.        
    32.         while ($buffer = rtrim(fgets($connect))) {
    33.             $headers .= $buffer."\r\n";
    34.     }
    35.         fwrite($fp[$connect], $headers."\r\n");
    36.         echo $headers;
    37.        
    38.         $headerss = '';
    39.         while ($buffer = rtrim(fgets($fp[$connect]))) {
    40.             $headerss .= $buffer."\r\n";
    41.  
    42.         }
    43.         fwrite($connect, $headerss."\r\n");
    44.         echo $headerss;
    45.        
    46.         //echo $headers;
    47.         //fclose($fp[$connect]);
    48.         //fclose($connect);
    49.         unset($connects[ array_search($connect, $connects) ]);
    50.     }
    51.  
    52. }
     
  4. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Может просто воспользоваться поиском: php socks proxy
     
  5. x4b

    x4b Новичок

    С нами с:
    4 дек 2014
    Сообщения:
    4
    Симпатии:
    0
    Адрес:
    Ярославль
    спасибо за информацию щас почитаю!
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    x4b, какбэ перед новичком не должно стоять таких задач, имхо. новичок должен учится манипулировать данными, использовать лексемы, постепенно повышая свой скил и сложность кода. чтоб прокси написать уже не просто пых нужно знать но и рфц по используемым протоколам. да и стек сетевой нужно понимать. поэтому извини, дружище, но форум новичков это не то место где обсуждается халявная публикация кода. ну то есть если б ты что-то написал что криво работает - мы бы тебе помогли с отладкой. хотя опять же это уже не уровень новичка. а так - код пальцем в небо, "ничего не понимаю но очень надо"... всё как обычно.
     
  7. x4b

    x4b Новичок

    С нами с:
    4 дек 2014
    Сообщения:
    4
    Симпатии:
    0
    Адрес:
    Ярославль
    Спасибо всем за все! Я все понял почти доделал сам чуть позже допилю и выложу код!
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    боже =)
     
  9. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    ваще капец )))
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    верим и ждём