Проблема реализации SOCKS 4 клиента

r4sh

Новичок
Проблема реализации SOCKS 4 клиента

Написал класс, изучив готовый найденный в сети для socks5

PHP:
<?php
    class socks4 {
        private $_socket;
        private $_connected;
    
        function socks4($ip, $port) {
            if ($this->_socket = fsockopen($ip, (int)$port, $errno, $errstr)) {
            	echo 'connected<br />';
                return true;
            }
            return false;
        }

        function connect($host, $port) {
            if ($this->_socket) {
                if (ip2long($host) == false || ip2long($host) == -1) {
                	$host = gethostbyname($host);
                }
                echo $host."<br />";
                $req = pack("C2nNC", 0x04, 0x01 , $port, ip2long($host), 0x00); //connect запрос
                fwrite($this->_socket, $req);
                
                $answer = "";
                
                while ($buff = fread($this->_socket, 1024)) {
                     $answer .= $buff;
                }
                
                $responce = unpack("Cnull/Cresult/nByte1/LByte2", $answer);
                if($responce["result"] == 0x5a) {
                	echo 'good conn<br />';
                    $this->_connected = true;
                    return true;
                }
                echo $responce["result"]."<br />";
                echo 'bad conn<br />';
                return false;
            }
            $this->connected = false;
            return false;
        }
        
        //посылается HTTP запрос в сокет
        function send($buffer, $length = 0) {
            if ($length = 0) {
                $length = strlen($buffer);
            }
            if ($this->_connected) {
            	$output = '';
                fwrite($this->_socket, $buffer, $length);
                while ($str = fread($this->_socket, 1024)) {
                    $output .= $str;
                }
                return $output;
            }
            return false;
        }
}
?>
и тестовый скрипт:
PHP:
<?php
    include("socks4.lib.php");
    
    $server_name = "fashiontravel.ru";
    $server_port = 80;
    $socks = new socks4("85.114.40.2", 1080);
    
    $request  = "GET / HTTP HTTP/1.1\r\n";
	$request .= "Host: $server_name\r\n";
	$request .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n";
	$request .= "Accept: text/html";
	$request .= "Connection: close\r\n\r\n";

    if ($socks->connect($server_name, $server_port)) {
        $responce = $socks->send($request);
  	    echo $responce;
   }
?>

RFC по SOCKS4 не нашел. Только по SOCKS5. По поиску нашел только обсуждения и коды для SOCKS 5, собственно с которых и переделывал :)

Прочитал довольно скудную информацию на Википедии.
Коннектится норм, ответ 0x5a. Но данные не получаю.

Шаманил с BIND и CONNECT запросами. Но безрезультатно.
Отправлял сначала BIND, получал ответ, потом CONNECT, получал ответ и посылал HTTP запрос. Безрезультатно.

Спецификацию нашел, прочитал. Все должно работать. Подозреваю что проблема в том, что надо по другому формировать данные для передачи.

-~{}~ 25.04.08 13:33:

Проблема решена. при посылке данных в сокс не нужно указывать длину данных в fwrite().

http://mcoderz.jino-net.ru/sock4.lib.php.txt - рабочий вариант класса
 
Сверху