通过代理进行PHP套接字连接

Ank*_*ise 12 php sockets proxy

我正在处理现有的库,我希望它只通过代理建立与套接字的连接.目前的代码是

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$result = socket_connect($socket, "www.host.com", 8080);
Run Code Online (Sandbox Code Playgroud)

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

我试过了

socket_bind($socket, '127.0.0.1', '9150');
Run Code Online (Sandbox Code Playgroud)

哪个是vidalia服务器,我也尝试过一些来自互联网的代理,它们在firefox上作为袜子工作,但无法通过它连接这个代码.

当我尝试放在线上时,我得到了以下错误.

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

Vla*_*sev 11

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

函数socket_bind()用于设置连接的源地址.不适用于将其绑定到远程服务.基本上你指示你的套接字显示为来自127.0.0.1:9150并且它抱怨你可能在那里运行你的SOCKS代理.即使您有这个地址/端口可用也无济于事:您无法在其他任何地方从localhost连接.

只有正确使用socket_bind()在socket_create()之后和socket_connect()之前 - 建立连接后,您无法更改源地址.

清除此问题后,让我们解决您"仅通过代理与套接字建立连接"的问题.老实说,你的问题在细节上是模糊的:你想要达到什么目的?您需要一个流,或者您只需要通过HTTP请求呼叫一些远程Web服务器?

鉴于您对套接字的误解,并且您有"www.host.com",8080在您的问题中我相信您正在寻找通过SOCKS代理从www.host.com:8080拉出的网页.在这种情况下,您不需要重新发明轮子并使用cURL:请参阅如何使用cURL 使用SOCKS 5代理?

如果我的预感错了,你真的需要一个通过SOCKS代理的流,那么你需要一些外部库来为你做.没有标准的PHP扩展可以为您执行此操作.您可以查看https://github.com/clue/php-socks以获取SOCKS上的数据流.