跨平台的C++网络编程(无需大型库)

8
我觉得最好还是先解释一下背景,这样问题就不会太过复杂。我想为一个项目发布一些启动代码,希望我的学生能够参与其中。该项目涉及通过一些互联网网页进行数据爬取,因此,我想提供一个URLStream类,以便下载一个输入URL的HTML并将其作为字符串返回给他们。
问题在于,我找不到特别好的处理网络的跨平台方法(学生使用的是Mac/Windows/Linux操作系统)。我知道像Boost asio和libCurl这样的库,但使用它们的问题在于我无法强制所有学生都下载它们。所以我的问题有两个:
1. 有没有什么好的方式可以提供这种跨平台的网络代码给他们?
2. 如果只有库才能解决这个问题,那么有没有办法把库附加到启动项目中,让学生不必下载它?我知道这可能是一个愚蠢的问题,但我似乎找不到是否有可能实现这一点。

这个练习的目标是什么?让学生学习低级网络编程?学习HTTP?还是其他什么?除非目标是让学生(或)学习低级网络编程,否则我强烈建议您使用第三方库(如libcurl)。这将使您和您的学生都更容易。而且对于您来说需要的维护会更少,对于您来说也会有更少的支持和问题。 - Some programmer dude
@Someprogrammerdude 这个练习的目标与网络无关。他们最多只是在玩弄html。我只希望他们能够专注于任务,而不必担心网络问题。我非常愿意使用第三方库,但这将涉及告诉他们下载和设置库(对吧?)-这正是我想避免的,因为他们不应该担心这些细节。能否将libcurl附加到起始项目中,以便他们不必下载它? - gowrath
如果您可以访问大多数学生可以访问的系统(Windows 系统、macOS 系统和 Linux 系统),那么您可以始终预先构建一个静态库(例如 libcurl),并使用起始代码一起分发,并提供如何构建该库的简单说明。 - Some programmer dude
但是,您可以使用低级套接字制作自己的简单HTTP功能,特别是如果您只想进行简单的GET请求。在这里好消息是,所有主要平台都支持Berkeley sockets,在Linux和macOS上应该是一对一的匹配,在Windows上略有不同。缺点是,如果您以前没有自己进行过低级网络编程,可能需要花费一些时间来理解,而且您需要编写大量的样板代码。 - Some programmer dude
@Someprogrammerdude 感谢您详细的回复。如果您想将其转换为答案,我可以为您点赞。我的一些请求必须转到维基百科页面,我在使用原始套接字时遇到了一些问题。看来我需要加倍努力。 - gowrath
3个回答

5
Boost.Asio不适合您的需求,因为它涉及到庞大的Boost并且至少需要构建一些非头文件库。您仍然可以考虑使用Asio,该库可以在没有Boost的情况下使用,并且是头文件库,对您和您的学生来说都更方便。由于它可能是最受欢迎和现代化的网络C ++库,这个练习可以为学生提供一些有用的经验。Asio示例还包括一个简单的HTTP客户端

顺便提一下,您是否必须在此任务中使用C ++?使用Python或类似语言会更简单,因为它们提供了开箱即用的网络功能。


这个任务的主题是什么?他们最多只是在搞 HTML。也许只需要给他们离线 HTML,然后就完成了? - Andriy Tylychko
他们正在编写一个类似PageRank的程序,因此需要能够跟随任意链接。 - gowrath

4

伯克利套接字 API 是最常见的低层套接字 API。它被所有 POSIX 平台支持,这意味着 Linux 和 macOS 都会拥有它。

即使 Windows 也有它,但是稍有不同,因为在 POSIX 系统上,套接字不像描述符一样。

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

有许多关于使用套接字的教程和参考资料。Beej's Guide to Network Programming 似乎是一个流行的教程,其中应该有关于 Windows 所需调整的注意事项。


最小可运行示例:https://dev59.com/qWgu5IYBdhLWcg3wnYLo#35680609 - Ciro Santilli OurBigBook.com

0

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

asio是一个跨平台的C++网络编程库,采用现代化的C++方法为开发人员提供一致的异步I/O模型。它最近已被纳入Boost。

我从Synaptic的信息窗口中复制了这个内容。如果您正在使用Linux,请按如下方式安装该库(及其文档):

sudo apt-get install libasio-dev libasio-doc


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