【问题标题】:Cross Platform C++ Networking (without big library)跨平台 C++ 网络(无大库)
【发布时间】:2018-01-22 04:45:52
【问题描述】:

我认为最好解释一下情况,这样这个问题就不会显得太神秘了。我想为我希望我的一些学生从事的项目发布一些入门代码。该项目涉及抓取一些互联网网页,因此,我想为他们提供一个 URLStream 类,该类将下载输入 url 的 html 并将其作为字符串返回给他们。

问题是我似乎找不到一种特别好的方法来处理跨平台的网络(学生有 mac/windows/linux 机器)。我知道像 Boost asio 和 libCurl 这样的库,但是使用这些库的问题是我不能强制我所有的学生都下载它们。所以我的问题是双重的:

  1. 有什么好的方法可以为他们提供这个跨平台的网络代码吗?
  2. 如果图书馆是这样做的唯一方法,有没有办法将图书馆附加到启动项目,这样学生就不必下载它?我知道这可能是一个愚蠢的问题,但我似乎无法确定这是否可行。

【问题讨论】:

  • 练习的目标是什么?让学生学习低级网络编程?学习 HTTP?或者是其他东西?除非目标是让学生(或)学习低级网络编程,否则我强烈建议你使用第三方库(如 libcurl)。这将使您和您的学生更容易。您需要的维护工作将大大减少,给您的支持和问题也将大大减少。
  • @Someprogrammerdude 练习的目标与网络无关。他们最多是在搞乱html。我只是希望他们能够专注于任务,而不必担心网络问题。我非常愿意使用 3rd 方库,但这需要我告诉他们下载和设置库(对吗?)——我试图避免这种情况,因为他们不必担心这些细节。是否可以将 libcurl 附加到启动项目,这样他们就不必下载它了?
  • 如果您可以访问学生可以访问的大多数系统(Windows 系统、macOS 系统和 Linux 系统),那么您始终可以预先构建一个静态库,例如libcurl 随您的启动代码一起分发,并在构建时提供有关如何使用该库的简单说明。
  • 但是您可以使用低级套接字创建自己的简单 HTTP 功能,特别是如果您只想发出简单的 GET 请求。这里的好消息是所有主要平台都支持Berkeley sockets,它在 Linux 和 macOS 上应该是一对一的匹配,Windows 只是略有不同。不利的一面是,如果您自己没有进行过低级网络编程,可能需要一些时间才能获得正确的结果,并且您需要编写大量样板代码。
  • @Someprogrammerdude 感谢您的详细回复。如果你想把它变成一个答案,我可以投票。我的一些请求必须转到 wikipedia 页面,而我在使用原始套接字时遇到了麻烦。我想我会加倍努力。

标签: c++ networking


【解决方案1】:

Boost.Asio 确实不适合您的需求,因为它涉及巨大的 Boost 并至少构建了一些非标头库。您仍然可以考虑Asio lib,它可以在没有 Boost 的情况下使用,并且是仅包含标头的库,这样对您和您的学生来说就少了很多麻烦。因为它可能是最流行和最现代的网络 C++ 库,所以这个练习可以为学生提供一些有用的经验。 asio的例子也有a simple HTTP client

附带说明一下,您是否必须使用 C++ 来完成这项作业?在 Python 或提供开箱即用网络的类似语言中,它会简单得多。

【讨论】:

  • 那么这个作业的主题是什么? 他们最多只是在搞乱html。也许只是给他们离线HTML然后就完成了?
  • 他们正在编写一个页面排名类型的程序,所以需要能够跟踪任意链接。
【解决方案2】:

Berkeley sockets API 是最常见的低级套接字 API。它在所有 POSIX 平台上都受支持,这意味着 Linux 和 macOS 都将拥有它。

即使是 Windows 也有,但略有不同,因为套接字不是 POSIX 系统上的描述符。

直接使用套接字会导致更多样板代码,但绝对可以使用它来制作一个仅支持简单GET请求的简单HTTP客户端。

有很多关于使用套接字的教程和参考资料。 Beej's Guide to Network Programming 似乎是一个受欢迎的教程,其中应该有关于 Windows 所需调整的说明。

【讨论】:

【解决方案3】:

用于网络编程的跨平台 C++ 库

asio 是一个用于网络编程的跨平台 C++ 库,它提供 具有使用现代 C++ 的一致异步 I/O 模型的开发人员 方法。它最近已被 Boost 接受。

我从 Synaptic 的信息窗口中复制了它。如果您使用的是 Linux,请安装该库(及其文档):

sudo apt-get install libasio-dev libasio-doc

【讨论】: