【发布时间】:2015-02-18 17:00:53
【问题描述】:
我正在使用连接到代理并通过它发送数据的 socks5 php 库。该库在我向 http 服务器发出单个请求时工作,但是当我在接收空字符串中执行第二个请求时,在第三个时我收到一个错误
10053 已建立的连接被您的软件中止 主机。
我不明白为什么会这样,我查看了有关 socks5 服务器的 RFC 和维基百科,我认为所有连接都是正确的。但仍然没有得到第二个回应。
库代码是一个文件,我从这里得到它Socks5Socket
我的代码是下一个
set_time_limit(100);
error_reporting ( E_ALL );
require_once "Socks5Socket.php";
$s = new \Socks5Socket\Client();
$s->configureProxy(array(
'hostname' => '162.144.56.44',
'port' => 60088
));
$s->connect('en.wikipedia.org', 80);
$request = "GET /wiki/HTTP_persistent_connection HTTP/1.1\r\n".
"Host: en.wikipedia.org\r\nConnection: Keep-Alive\r\n\r\n";
$s->send($request);
$response = $s->readAll();
//At this point all OK
$request2 = "GET /wiki/No-till_farming HTTP/1.1\r\n".
"Host: en.wikipedia.org\r\nConnection: Keep-Alive\r\n\r\n";
$s->send($request2);
// Empty string here, no error
$response2 = $s->readAll();
$s->send($request2);
// Errno 10053
$response3 = $s->readAll();
file_put_contents("response.txt",$response2);
$response = substr($response,strpos($response,"»")+1);
//echo $response;
echo "<br><br>".substr($response,strpos($response,"\r\n\r\n")+1);
【问题讨论】:
-
您是否验证了目标 HTTP 服务器正在遵守保持活动状态?第一个响应中
Connection标头的值是多少?如果服务器在发送第一个响应后关闭连接,则代理将关闭与您的客户端的连接,因此您必须在发送第二个请求之前再次重新连接到代理。 -
顺便说一句,使用
readAll()不是读取 HTTP 响应的正确方法。您需要实际读取 HTTP 标头并解析它们以了解如何读取其余响应数据。这意味着适当地使用readLine()和read(),而不是使用readAll()。您必须遵循 HTTP 处理规则以确保连接的完整性,尤其是如果您想使用 HTTP 保持活动。 -
@RemyLebeau 你是对的,http 服务器正在关闭我的连接。我已经尝试过使用 smtp 服务器,一切正常。
-
HTTP 不保证持久连接。在最坏的情况下,您必须准备好在每个请求上重新连接。 HTTP 1.1 将持久性作为默认设置,但不是必需的。
标签: php proxy connection socks