我正在用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。
答案 0 :(得分:0)
听起来好像你可能无法正确理解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
变量将不起作用(除非您在第一个斜杠上手动拆分它)。