在php示例中,Socks 4绑定

时间:2015-11-05 09:12:20

标签: php socks

<?php

error_reporting(E_ALL);

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false)
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";

$result = socket_connect($socket, "92.51.77.126", 1080); // socks ip

if ($result === false)
    echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";

$in  = "\x04\x02";
$in .= "\x00\x50";  // http proxy port
$in .= "\xc0\xf0\x2e\x7e";  // http proxy ip address
$in .= "\x00";

socket_write($socket, $in, strlen($in));

sleep(1);

$in  = "HEAD / HTTP/1.1\r\n";
$in .= "Host: www.example.com\r\n";
$in .= "Connection: Close\r\n\r\n";

socket_write($socket, $in, strlen($in));

$out = '';
while ($out = socket_read($socket, 2048)) {
    echo $out;
}

socket_close($socket);

?>

我想绑定一个socks 4代理服务器来连接另一个代理。这个例子是secound代理是一个http代理。当连接第一个正常连接时,服务器应答被授予,但此时的通信已完成。这个例子如何继续沟通?

1 个答案:

答案 0 :(得分:0)

你很幸运得到了一个'Granted'回复 - 我在OpenSSH中没有得到SOCKS服务器的任何回复,只是关闭了连接......

据我了解SOCKS4描述,类型2(BIND)请求的答案包含端口号和IP地址;当一个连接到达它们时,你的程序将能够读取下一个状态包,它告诉你连接。等待连接的时间有限(似乎是2分钟)。这主要用于FTP客户端 - FTP服务器需要与客户端的反向连接,BIND允许连接传递。

如果要从侧面发起连接,请使用类型1(CONNECT)请求。另外,请确保请求中的端口和IP地址是正确的 - 在您的代码中它们似乎是80和192.240.30.126。