如何处理非常具体的网址?

时间:2014-02-23 05:16:20

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

我正在用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插入时,程序不知道我在说什么。具体来说,我得到以下内容:

Unhandled Exception

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

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

1 个答案:

答案 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变量将不起作用(除非您在第一个斜杠上手动拆分它)。