Добрый день! Я не очень силен в написании скриптов PHP а уж темболее в stream_socket. Задача перед мной стоит следуйщая сервер linux на нем крутититься PHP5 запущен скрипт РНР с бесконечным циклом создан сервер сокет который слушает порт 8000 и в этойще сети где сервер есть другой комп на который нужно отправить весь трафик приходящий с порта 8000 в порт 8003 другой машины и на оборот принять с 8003 порта другой машины и отправить клиенту который конетился на сервер порта 8000, что то типа порт maping. знаю что можно сделать другими средствами, но нужно именно на РНР в большей части чтобы смотреть и вслучаи чего править header-ы. Если кто может помочь очень прошу! В долгу не останусь могу оплатить работу конечно в пределах разумного. спасибо! Ниже то что я накалякал. Код (Text): <?php $socket = stream_socket_server("tcp://99.99.99.99:8000", $errno, $errstr); //сокет сервера if (!$socket) { die("$errstr ($errno)\n"); } $connects = array(); while (true) { //формируем массив прослушиваемых сокетов: $read = $connects; $read []= $socket; $write = $except = null; $fp_read = $fp_connects; $fp_read []= $fp; $fp_write = $fp_except = null; if (!stream_select($read, $write, $except, null)) {//ожидаем сокеты доступные для чтения (без таймаута) break; } if (in_array($socket, $read)) {//есть новое соединение $connect = stream_socket_accept($socket, -1);//принимаем новое соединение $connects[] = $connect;//добавляем его в список необходимых для обработки unset($read[ array_search($socket, $read) ]); } $fp = stream_socket_client("tcp://192.168.0.1:8003", $errno, $errstr, 30, STREAM_CLIENT_ASYNC_CONNECT); //клиент куда нужно подключаться и отправлять данные и принимать обратно и отправлять в 99.99.99.99:8000 foreach($read as $connect) {//обрабатываем все соединения $headers = ''; while ($buffer = rtrim(fgets($connect))) { $headers .= $buffer."\r\n"; //fwrite($connect, fgets($fp)); } //echo $headers."\r\n"; $headers = ''; while ($buffer = rtrim(fgets($fp))) { $headers .= $buffer."\r\n"; } //fwrite($connect, $headers."\r\n"); //if echo $headers; //} //fclose($fp); } //echo $headers; //fclose($connect); unset($connects[ array_search($connect, $connects) ]); } } ?>
пхп не предназначен для написания прокси-серверов. для этого есть специализированный софт. но если надо извращений - принимаем на сокете подключение, форкаемся дабы иметь возможность обслуживать многократные подключения без залипания в очередь, подключаемся к бэкэнду, вычитываем входной поток в сокет бэкэнда, вычитываем ответ бэкэнда в свой выходной поток. соответственно на чтение из-в и нужно поставить требуемую прослойку работы с заголовками.
дружище спасибо тебе огромное но я не профи некоторые слова для меня непонятны =) если можно примерным куском кода или последовательностью буду признателен. Добавлено спустя 10 минут 39 секунд: на данный момент получилось чтото вроде этого только клиент подключающийся на 8000 порт постояно реконет делает Код (Text): <?php $socket = stream_socket_server("tcp://99.99.99.99:8000", $errno, $errstr); if (!$socket) { die("$errstr ($errno)\n"); } $connects = array(); while (true) { //формируем массив прослушиваемых сокетов: $read = $connects; $read []= $socket; $write = $except = null; if (!stream_select($read, $write, $except, null)) {//ожидаем сокеты доступные для чтения (без таймаута) break; } if (in_array($socket, $read)) {//есть новое соединение $connect = stream_socket_accept($socket, -1);//принимаем новое соединение $connects[] = $connect;//добавляем его в список необходимых для обработки unset($read[ array_search($socket, $read) ]); } foreach($read as $connect) {//обрабатываем все соединения $fp[$connect] = stream_socket_client("tcp://192.168.0.1:8003", $errno, $errstr, 30, STREAM_CLIENT_ASYNC_CONNECT); $headers = ''; while ($buffer = rtrim(fgets($connect))) { $headers .= $buffer."\r\n"; } fwrite($fp[$connect], $headers."\r\n"); echo $headers; $headerss = ''; while ($buffer = rtrim(fgets($fp[$connect]))) { $headerss .= $buffer."\r\n"; } fwrite($connect, $headerss."\r\n"); echo $headerss; //echo $headers; //fclose($fp[$connect]); //fclose($connect); unset($connects[ array_search($connect, $connects) ]); } }
x4b, какбэ перед новичком не должно стоять таких задач, имхо. новичок должен учится манипулировать данными, использовать лексемы, постепенно повышая свой скил и сложность кода. чтоб прокси написать уже не просто пых нужно знать но и рфц по используемым протоколам. да и стек сетевой нужно понимать. поэтому извини, дружище, но форум новичков это не то место где обсуждается халявная публикация кода. ну то есть если б ты что-то написал что криво работает - мы бы тебе помогли с отладкой. хотя опять же это уже не уровень новичка. а так - код пальцем в небо, "ничего не понимаю но очень надо"... всё как обычно.