【问题标题】:PHP Socket Connection Via Proxy通过代理的 PHP 套接字连接
【发布时间】:2015-09-23 15:19:28
【问题描述】:

我正在开发一个现有的库,我希望它只通过代理建立到套接字的连接。 当前代码是

$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]:每个套接字地址(协议/网络地址/端口)通常只允许使用一次。

【问题讨论】:

    标签: php sockets proxy


    【解决方案1】:

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

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

    socket_bind() 的正确用法是在 socket_create() 之后和 socket_connect() 之前 - 建立连接后,您不能更改源地址。

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

    鉴于您对 sockets_ 的误解,并且您的问题中有“www.host.com”,8080,我相信您正在寻找通过 SOCKS 代理从 www.host.com:8080 提取的一些网页。在这种情况下,您无需重新发明轮子并使用 cURL:请参阅How to use a SOCKS 5 proxy with cURL?

    如果我的预感是错误的,并且您确实需要通过 SOCKS 代理的流,那么您需要一些外部库来为您完成。没有标准的 PHP 扩展可以为您做到这一点。您可以查看https://github.com/clue/php-socks 以通过 SOCKS 获取数据流。

    【讨论】:

    • 我真的很感谢您为解释所做的努力,但您能否给我提供流程结构或解释此过程的内容,有什么合适的方法来完成我正在尝试的事情吗?
    • 请告诉我你到底想做什么:你想访问远程网页还是需要建立数据流?
    猜你喜欢
    • 2014-03-21
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 2011-06-25
    相关资源
    最近更新 更多