boost asio 学习(八) 网络基础 二进制写发送和接收

http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-
started-with-boostasio?pg=9

8. Networking basics: binary protocol sending and receiving (TCP)

现在我们了解了boost::asio库和一些简单的tcp网络知识。现在进行一些简单的网路底层封装.通过使用这些分装。我们能重复使用并且将
注意力集中在程序逻辑而不是一再编写网络通讯代码。
重要注意事项:代码完全是出于教育目的。不要在商业系统中使用。
另外 使用这个网络封装代码的开销是需要考虑的。比如说,大量的vector与list的分配。bind与shared_ptr指针的开销。这也是这个代码
仅用来作为教育用途的原因。


有多重类型的函数用来发送和接收。我们基于协议选择不同的类型。
我们的例子中使用async_write and async_read_some.
使用async_write的原因是函数写入所有的数据,而无需担心部分发送的问题。同样的,我们使用async_read_some作为通用函数去读取数
据因为我们没有特定的协议用来接收。


现在我们学习一个完整的使用IO函数的例子。我们扩展7-C的例子。

  

这个例子中,我们添加了ClientContext 类。它用来存储所有传入连接的上下文的具体结构。类封装了必须的io接收发送的函数。例子中
,服务器将发送一个具体的信息给传入连接。我们没配置一个具体的客户端去测试,仅仅使用简单的telnet即可。任意数据发送到服务器
将被输出到命令行。
同上一个例子不同的是,每个连接都需要自己的上下文。上下文应包含socket 发送接收缓存以及其他用户数据。另外,例子不是线程安装
的,所以我们限制在一个线程运行。我们将稍后讨论这个问题。现在,对于socket的读写将选择正确的api函数以避免发生问题.


为了正确的使用,我们必须确认上下文和缓存在函数的生存的整个期间都是有效的。这个例子中,我们使用一个vector list来发送,使用一个vector来接收缓存。根据我们实现的协议,我们可能需要做一些小小的改动。比如说,如果我们想处理流中的包。这种情况下,我们将希望使用async_read读取头结构然后使用async_read读取具体尺寸的数据。


在大型程序中,一次只处理一个包的缺点就是效率低下。假设我们有1003字节信息在流中。我们将执行读取包这个逻辑100次。而我们使用async_read_some,效率会更高。

posted on   itdef  阅读(2070)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示