判断 ipv4 与 ipv6 地址 C++实现原理(boost源码为例)

在使用 boost asio 时, 对 accept类初始化时的过程感到兴趣,
因此调试过程中, 观察了其 bind 和 listen之前对服务器地址的处理.

调试观察的 boost 源码版本为 1.55.0

boost 源码的判断的思路:
1. 优先判断是否为 ipv6 地址
2. 其次判断是否为 ipv4 地址
3. 判断地址的关键的系统调用 inet_pton
boost 源码的 boost::asio::detail::socket_ops::inet_pton
其实最后调用的是系统的 inet_pton, 封装的名字够深的, 哈哈

inet_pton 的描述:

截取的 boost 源码:

Continue reading

TCP/IP UDP/IP 传输数据的应用层包大小如何定

本文的写作起因:
本人负责项目中手机底层通信模块开发, 和做游戏的前端同事
沟通网络手游时的网络状况. 听到同事描述各种的网络环境
(咨询的是游戏更新时, 下载更新包的环境):
1. wifi连接情况, 正常的情况, 连接网络质量良好的 wifi
2. wifi连接情况, 两个wifi都可以自动连接的情况下, 手机一会连接 wifi-a, 一会 wifi-b
3. 3G网络连接(壕啊, 一款网络手游上百兆都有可能, 下载速度都可能比 使用运营商家用宽带服务的都快)
4. 2G网络连接(这个情况都有玩家更新 –b )

由以上场景, 当时联想到熟悉的词: MTU(Maximum Transmission Unit, 最大传输单元)
在各种网络环境下, 也包括PC端, 都有一个 MTU 的缩写词, 有时候家用网络优化,
百度搜索都有答案告诉你 修改系统 MTU 的值.

同时在自己的项目里, 对自己有个问题, 一次发多少大小以内的 tcp/udp 数据包合适?

通过查询资料, 做个记录:

Continue reading