C++和网络套接字

C++ and network sockets

本文关键字:套接字 网络 C++      更新时间:2023-10-16

我已经涉足了C语言,目前正在学习C++。

我想学习标准库(std::命名空间),所以我正在做一些项目。 一个是一个简单的电子邮件程序,它登录到我的本地SMTP服务器并显示我的电子邮件,并具有发送邮件的能力。 我为那种古老的感觉添加了一丝诅咒。

问题是,我无法找到使用网络套接字的标准库方法。 似乎我必须在 Csys/socket.h中使用网络套接字,但随后我最终得到了一个文件描述符,它留下了read()write()以及send()函数调用。 我希望能够使用std::fstreamstd::ostream类。 但是open()成员函数采用文件名,而不是文件描述符。

我知道 Boost 库具有此功能,但模板等超出了我的头脑,我现在只想坚持使用标准库。

在继续之前,我只想确保没有更好的方法来read()write()connect()网络套接字 C 函数返回的文件描述符。

标准库不包含套接字或任何网络支持。

您的选择是

  1. BSD 套接字,如果您通过操作系统特定的库使用 *nix
  2. BSD阻塞套接字,如果你在Windows上,通过Winsock
  3. 异步套接字,如果您使用的是 Windows,则通过 Winsock 和 Windows 消息泵
  4. IOCP,如果你在Windows上,通过Winsock
  5. 提升 ASIO,这是便携式的。
  6. 其他一些第三方库,其他人使用了上述之一并为您包装了它。

在所有这些中,我个人认为,Boost ASIO是最容易使用的。我建议至少通过一个关于阻止BSD套接字的教程来了解这些概念。

所有这些,除了 5 和 6,都将非常像 C。网络编程实际上不是一个面向对象编程和C++统治旧C风格的利基市场。你可以包装东西,但这是你能希望的最好的。

你真的不会在你的套接字代码中使用 fstream 或 ostream。也许在它上面的一层,但最终,所有这些实现都是相似的,因为您将发送和接收字节的二进制数据或文本。

您可以将std:::istreamstd::ostream与套接字一起使用,您只需编写自己的(或找到预先存在的第三方)自定义std::basic_streambuf派生类,该类使用套接字I/O而不是文件 I/O,然后您可以通过其构造函数或rdbuf()方法将该类的实例分配给std::(i|o)stream