【发布时间】: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