php - 使用 CURL 访问我的家庭网络

标签 php scripting curl

这个问题涵盖了 ServerFault.com 和这里,但这似乎比服务器更多的是编程。我将家用计算机设置为运行 Apache 服务器。它响应端口 5900,该端口已从我的无线路由器转发过来。然后我设置了一个动态 DNS 服务器来不断更新我家庭网络的 IP 地址。我知道这部分是有效的,因为我在不同的无线网络上使用了不同的计算机,并且能够使用 MYURL.com:5900 访问我的服务器的索引页面。

我的目标是现在向我的家庭服务器发送一条消息。我在我的家庭服务器上写了一个脚本,如果我向它发送一条 POST 消息,它会将该消息保存到一个文件中。换句话说,一系列事件应该是这样的:

  1. 我登录到我的网页,在输入中输入文本,然后点击发送按钮
  2. 消息被传递到我网站的服务器。
  3. 我的服务器运行一个脚本,该脚本使用 CURL 将消息作为 POST 发送到我的家庭服务器的 DDNS
  4. 家里的服务器接管该职位,并运行将其写入文件的脚本。

我知道如何做 1,2 和 4。我一直试图让 3 工作但做不到。我什至不能让 CURL 读取我的家庭服务器的 index.html。这是我与 CURL 一起使用的代码(使用 PHP):

    $string = 'http://MYURL.com';

    echo "sending to " . $string . '<br/>';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $string);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_PORT, 5900);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);

    if(curl_error($ch))
    {
        echo curl_error($ch);
    }
    echo $response;

    curl_close($ch);

我使用 google.com 和默认端口对此进行了测试,它运行良好。它呼应了谷歌给我的 html。但是,当我在家庭服务器的 DNS 上运行它时,它总是超时。当我不添加超时时,它说无法连接。这是使用完全相同的 URL,当放入浏览器时,它会正确地向我发送我的家庭服务器的 index.html。

有人知道怎么回事吗?另外,如果有更好的方法来做到这一点,它是什么?

我知道这是一个很长的问题,所以非常感谢。

伊桑

最佳答案

你从哪里测试这个?如今,大多数网络都受到严格的防火墙保护,并且不允许传出连接到陌生端口。您的端口 5900 肯定是奇怪的。

您使用无线(我假设是 3G?)网络进行测试的原因是 PC/笔记本电脑恰好直接连接到互联网,因此没有被防火墙阻止。

测试防火墙理论的最简单方法是在端口 80 上的服务器上设置一个测试页面,然后尝试使用 CURL 访问它。如果这有效,那么您就知道问题出在路由器和代理链中有人阻塞了您的端口 5900。


为什么端口 80 不被认为是“奇怪的”:

端口 80 是 port conventionally used for HTTP (web server) as assigned by IANA .因此,考虑到人们连接到互联网的主要原因是访问万维网(在 HTTP 上运行,因此需要打开端口 80),它通常不会被阻止。阻止端口 80 会使互联网变得毫无用处(好吧,不完全是,你还有电子邮件)。如果系统管理员曾经阻止端口 80,他还不如断开互联网连接。这就是默认情况下端口 80 未被阻止的原因。

现在,这对您来说意味着什么,家庭服务器管理员。当然,您的 IP 地址只有一个 80 端口。这意味着实际上只能有一个端口转发规则附加到端口 80。这意味着您的本地网络上只能有一台计算机向外界提供网页* .如果您的弟弟或妹妹想要运行另一个 Web 服务器,那么他/她将不得不使用另一个端口。

这就是为什么 Web 服务器被设计为服务于多个网页(它们检测 URL,因此单个端口 80 可以服务于不同的站点)。它允许单个 IP 地址从一台机器为不同的网站提供服务。 Google:http 虚拟主机 了解更多信息。

*注意:不完全正确,您可以使用负载平衡或重新路由代理将 HTTP 请求重定向到网络上的其他机器。但是原理还是对的。只有一台机器的80端口可以直接暴露在互联网上。其他的只是代理。

关于php - 使用 CURL 访问我的家庭网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3695770/

相关文章:

php - 创建一个短代码,在 Woocommerce 中显示简单的产品名称列表

php - Laravel 5.2 Storage::makeDirectory($dir) 没有创建目录

php - 内存缓存性能

grails - 如何通过命令 `create-unit-test` 更改 Grails 用于生成单元测试的模板?

scripting - Vista 语音识别引擎是否有像 Naturally Speaking 这样的脚本?

java - 有任何命令行实用程序(如 wget、curl 等)和/或 java 方法来获取缩短的 URL 的元数据?

json - 对 NGINX 服务器上托管的 Node.js Express 服务器的 cURL POST 请求返回 502 错误

php - cURL 错误 60 没有消失

php - PHP 中的 FileCache 与 Session

linux - 格式化许多记录,使用公共(public)键将行转换为列