【问题标题】:How do I address a very specific web url?如何处理一个非常具体的网址?
【发布时间】:2014-03-24 17:49:54
【问题描述】:

我正在用 C++ 编写代码(使用 Poco 网络库)来尝试创建一个有趣的程序,它每隔几个小时就会通过电子邮件向我发送 TwitchPlaysPokemon 流的更新(愚蠢,我知道)。这是我的代码:

#include <iostream>   
#include "Poco/Net/SocketAddress.h"
#include "Poco/Net/StreamSocket.h"
#include "Poco/Net/SocketStream.h"
#include "Poco/StreamCopier.h"

using namespace std;
using namespace Poco::Net;
using namespace Poco;

int main(int argc, char *argv[])
{   
    string url = "www.reddit.com";

    string fullPage;
    SocketAddress sa(url, 80);
    StreamSocket socket(sa);
    SocketStream str(socket);
    str << "GET / HTTP/1.1\r\n"
     "Host: " << url << "\r\n"
     "\r\n";
    str.flush();

    StreamCopier::copyStream(str, cout);    
}

这个确切的代码工作得很好。它抓取 www.reddit.com 的原始 html 并将其打印到控制台。但是,我正在尝试从两个地方之一为我的程序获取信息:

要么:

Here (url = "http://www.reddit.com/live/sw7bubeycai6hey4ciytwamw3a")

Here(url = "https://sites.google.com/site/twitchplayspokemonstatus/")

其中任何一个都可以满足我的目的。问题是当我将这些值作为 url 插入程序时,程序不知道我在说什么。具体来说,我得到以下信息:

很明显它找不到主机。这就是我卡住的地方,因为我对互联网协议、主机等知之甚少。我试图查看该网站是否有特定的 IP 地址(使用 cmd 提示 ping),但它也无法弄清楚(它说“Ping 请求找不到主机 www.reddit.com/live/sw7bubeycai6hey4ciytwamw3a”)。 Poco 库接受写出的 url (www.reddit.com)、IPv4 和 IPv6 地址作为 SocketAddress 的主机输入(我使用变量 url,另一个变量是我被告知的端口应该基本上总是80?)

问题:我需要帮助弄清楚我应该如何识别 Poco 库的主机。换句话说,我如何正确地引用上面列出的这两个站点中的任何一个的主机,以便我的代码可以识别它并从页面中获取 HTML。

【问题讨论】:

  • 尝试找出抛出异常时的“情况”。从您的代码看来,HostNotFound 似乎是在几种不同的情况下引发的。您可以在执行应用程序的同一台机器上通过浏览器浏览这些链接吗?
  • 我不知道是什么具体情况导致了我的异常。如果我点击继续而不是中断,我遇到的一些例外是throw DNSException("EAI", NumberFormatter::format(code));,然后是throw DNSException("Temporary DNS error while resolving", arg);,最后是throw DNSException("Non recoverable DNS error while resolving", arg);。不确定这些是多米诺骨牌效应还是它们都是互斥的例外(显然最后两个是相关的)
  • 创建 SocketAddress 对象时是否使用完整 URL?您应该在那里只使用网站地址,并在发出 GET 请求时使用完整的 URL。您将完整的 URL 传递给 SocketAddress 构造函数,这就是它给您错误的原因
  • @mangusta 我只是使用 www.reddit.com 作为 URL 和“主机:”部分的完整地址,它似乎给了我 reddit 主页的 html,而不是我正在寻找的页面。
  • 不,您正在发出“GET /”。您应该发出“GET /

标签: c++ html web ip ip-address


【解决方案1】:

听起来您可能没有正确理解 HTTP。这是一个简短的复习。

要获取 URL http://www.example.com/path/page.html 的内容,相应的 HTTP 请求将被发送到端口 80 上的 www.example.com,并且将具有以下内容:

GET /path/page.html HTTP/1.1\r\n
Host: www.example.com\r\n
\r\n    

看起来您在这里做得不正确的关键部分是将 URL 拆分为主机名和路径组件。拥有一个 url 变量将不起作用(除非您在第一个斜杠上手动拆分它)。

【讨论】:

    猜你喜欢
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    相关资源
    最近更新 更多