<?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 для подключения другого прокси. В этом примере второстепенный прокси-сервер является http-прокси. При первом подключении обычно подключен сервер, ответ предоставлен, но связь в это время завершена. Как продолжил общение этот пример?
Вам повезло, что вы получили ответ «Разрешено» — я не получаю никакого ответа от сервера SOCKS в OpenSSH, он просто закрывает соединение …
Как я понимаю описание SOCKS4, ответ на запрос типа 2 (BIND) содержит номер порта и IP-адрес; Когда к ним прибудет соединение, ваша программа сможет прочитать следующий пакет состояния, который сообщает о соединении. Время ожидания соединения ограничено (кажется, 2 минуты). Это в основном для клиента FTP — серверу FTP необходимо обратное соединение с клиентом, а BIND позволяет установить соединение.
Если вы хотите инициировать соединение со своей стороны, используйте запрос типа 1 (CONNECT). Кроме того, убедитесь, что порт и IP-адрес в запросе верны — кажется, в вашем коде они 80 и 192.240.30.126.
Других решений пока нет …