通过代理连接PHP Socket

13

我正在处理一个已经存在的库,并且希望它只通过代理建立套接字连接。目前的代码如下:

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$result = socket_connect($socket, "www.host.com", 8080);

我希望通过代理(SOCK4/5)建立此连接。

我已经尝试过:

socket_bind($socket, '127.0.0.1', '9150');

什么是Vidalia服务器,我也尝试了一些从互联网上获得的代理,它们在Firefox上作为sock运行,但无法通过此代码进行连接。

当我尝试输入以上行时,我收到以下错误提示。

警告:socket_bind():无法绑定地址[10048]:每个套接字地址(协议/网络地址/端口)通常只允许使用一次。

1个回答

14

不想冒犯您,但似乎您不了解TCP/IP网络基础知识。socket_函数无法帮助您处理SOCKS代理,因为它们没有SOCKS客户端。

socket_bind()函数的目的是为连接设置源地址,而不是将其绑定到远程服务。基本上,您指示套接字从127.0.0.1:9150发出,并且它会抱怨,因为您可能在那里运行SOCKS代理。即使您有此地址/端口可用,也不会有所帮助:您只能从localhost连接到其他地方。

socket_bind()函数的唯一正确用法是在socket_create()之后、socket_connect()之前——连接建立后,您无法更改源地址。

现在解决了这个问题,让我们来看看你“仅通过代理建立套接字连接”的问题。老实说,你的问题缺乏细节:你想要实现什么?你需要一个流,还是只需要通过HTTP请求调用一些远程Web服务器?

鉴于您对sockets_的误解,并且在您的问题中具有“www.host.com”、8080,我认为您正在寻找通过SOCKS代理从www.host.com:8080获取某个Web页面。在这种情况下,您不需要重新发明轮子,可以使用cURL:请参见如何使用SOCKS 5代理与cURL?

如果我的猜测是错误的,你真的需要通过SOCKS代理获得流,那么你需要一些外部库来完成这项工作。没有标准的PHP扩展可以为您完成此操作。您可以查看https://github.com/clue/php-socks以在SOCKS上获取数据流。


我非常感谢您所做的解释工作,但您能否提供一些流程结构或其他可以解释这个过程的东西,以及完成我正在尝试的事情的任何适当方式吗? - Ankit Pise
请告诉我您想要做什么:您是想访问远程网页还是需要建立数据流? - Vladimir Bashkirtsev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接