r4sh
Новичок
Проблема реализации SOCKS 4 клиента
Написал класс, изучив готовый найденный в сети для socks5
и тестовый скрипт:
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 - рабочий вариант класса
Написал класс, изучив готовый найденный в сети для 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 - рабочий вариант класса