在C++中如何通过HTTP进行流媒体传输的帮助

3
我想使用一个提供流式API的Web服务。通常可以使用Java方法java.net.URL.openStream()来使用此API。
问题是我正在尝试用C ++设计我的程序,不知道要使用哪些库(我听说cUrl库非常擅长处理这种事情),也不知道如何使用它们来实现我想要的功能。
我的想法是,在将文件作为流打开后,我可以实时访问不断更新的数据。
任何帮助都将不胜感激。
2个回答

6

Boost.Asio 的套接字 iostreams 似乎是您需要的。您的代码将如下所示:

ip::tcp::iostream stream("www.someserver.com", "http");
if (!stream)
{
  // Can't connect.
}

// Use stream as a regular C++ input stream:
std::string text;
std::getline(stream, text);

如果你是C++新手,对iostream没有经验,那么这个页面是一个很好的信息来源。特别是,查看istream类的文档,了解你的Boost.ASIO流将支持哪种操作。你会发现它们与Java IO API中的操作并没有太大区别。

编辑:

Eric是正确的,你需要向服务器发送一些请求(使用相同的流),所以它可能不像我想象的那样类似于Java的openStream。下面的示例显示如何进行这些请求: http://blog.think-async.com/2007_01_01_archive.html

为了让你的示例正常工作,我认为你需要在从流中读取之前编写一个“GET”请求。类似这样:stream << "GET /index.html HTTP/1.0\r\n\r\n"; - Éric Malenfant
谢谢Éric,我错过了那个。 - Manuel

3

这要看你需要什么。如果你想在更低的层次上直接返回“原始”服务器响应,Manuel's suggestion中的boost::asio::ip::tcp::iostream很不错(但我怀疑他在答案中提供的示例中缺少某些东西:在从流中读取之前,应该向其写入“GET”请求。请参见Asio文档中的此示例)。

我对java.net.URL.openStream()没有经验,但似乎它在更高的级别上只返回回复的正文(而不是头部),处理HTTP重定向等。如果是这种情况,是的,libcurl可能更符合您的需求。您还可以查看cpp-netlib库,它建立在Boost.Asio之上。它仍处于初期阶段,但其http::client似乎已经提供了与Java URL.openStream()提供的相似的功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接