C++和网络套接字
C++ and network sockets
我已经涉足了C语言,目前正在学习C++。
我想学习标准库(std::
命名空间),所以我正在做一些项目。 一个是一个简单的电子邮件程序,它登录到我的本地SMTP服务器并显示我的电子邮件,并具有发送邮件的能力。 我为那种古老的感觉添加了一丝诅咒。
问题是,我无法找到使用网络套接字的标准库方法。 似乎我必须在 Csys/socket.h
中使用网络套接字,但随后我最终得到了一个文件描述符,它留下了read()
和write()
以及send()
函数调用。 我希望能够使用std::fstream
或std::ostream
类。 但是open()
成员函数采用文件名,而不是文件描述符。
我知道 Boost 库具有此功能,但模板等超出了我的头脑,我现在只想坚持使用标准库。
在继续之前,我只想确保没有更好的方法来read()
并write()
connect()
网络套接字 C 函数返回的文件描述符。
标准库不包含套接字或任何网络支持。
您的选择是
- BSD 套接字,如果您通过操作系统特定的库使用 *nix
- BSD阻塞套接字,如果你在Windows上,通过Winsock
- 异步套接字,如果您使用的是 Windows,则通过 Winsock 和 Windows 消息泵
- IOCP,如果你在Windows上,通过Winsock
- 提升 ASIO,这是便携式的。
- 其他一些第三方库,其他人使用了上述之一并为您包装了它。
在所有这些中,我个人认为,Boost ASIO是最容易使用的。我建议至少通过一个关于阻止BSD套接字的教程来了解这些概念。
所有这些,除了 5 和 6,都将非常像 C。网络编程实际上不是一个面向对象编程和C++统治旧C风格的利基市场。你可以包装东西,但这是你能希望的最好的。
你真的不会在你的套接字代码中使用 fstream 或 ostream。也许在它上面的一层,但最终,所有这些实现都是相似的,因为您将发送和接收字节的二进制数据或文本。
您可以将std:::istream
和std::ostream
与套接字一起使用,您只需编写自己的(或找到预先存在的第三方)自定义std::basic_streambuf
派生类,该类使用套接字I/O而不是文件 I/O,然后您可以通过其构造函数或rdbuf()
方法将该类的实例分配给std::(i|o)stream
。
- 在不知道套接字的情况下关闭网络连接
- 在网络套接字计时器滴答后增加asio短读错误
- 提升网络套接字接受挂起
- C++和网络套接字
- POCO 网络套接字异常
- 是否可以寻址另一个网络中的服务器/客户端套接字?(C++)
- 使用 Boost.Asio 将 UDP 套接字绑定到特定网络接口
- 使用 UDP 协议从 Windows 套接字发送到 Qt 套接字的网络数据包上的结构编码和解码
- 如何在提升野兽网络套接字中传递模型类型
- 如何确定网络堆栈何时准备好再次打开到同一主机/端口的套接字?
- 野兽网络套接字惯用关机
- 网络:当接口打开/关闭时,在所有接口上绑定套接字
- 通过网络中的套接字进行文件传输时,该程序中的文件传输错误是什么
- 使用C 中的套接字通过网络发送音频数据
- 使用 SFML C++库在 UDP 网络中进行多套接字"握手"
- 网络tcp套接字应用程序重试方法
- 如何使用套接字构建健壮的网络体系结构
- 使用 C/C++ 套接字模拟网络状况
- 安卓 NDK 套接字 网络无法访问
- C或C++库,用于对网络套接字帧进行编码和解码