STUN协议深度解析:NAT类型检测机制
深入解析RFC 5389定义的四种NAT类型(完全锥形、地址受限锥形、端口受限锥形、对称形)的行为特征与映射机制,基于STUN协议实现系统化的NAT类型检测算法,为P2P网络穿透提供精确的拓扑识别基础
深入解析RFC 5389定义的四种NAT类型(完全锥形、地址受限锥形、端口受限锥形、对称形)的行为特征与映射机制,基于STUN协议实现系统化的NAT类型检测算法,为P2P网络穿透提供精确的拓扑识别基础
1 | #include <stdio.h> |
1 | std::unique_ptr<int> ptr(new int(10)); |
shared_ptr 是一种共享所有权的指针,多个指针可以同时管理一个对象,当最后一个 shared_ptr 被销毁时,它所管理的对象才会被随之销毁。它的定义和用法如下:
1 | std::shared_ptr<int> ptr1(new int(10)); |
weak_ptr 是 shared_ptr 的一种扩展,它可以不增加所管理对象的引用计数而与 shared_ptr 交互,但它不能直接访问所管理的对象,需要通过 lock() 函数获得一个指向所管理的对象的 shared_ptr。通常用于解决 shared_ptr 循环引用的问题。它的定义和用法如下:
1 | https://dev.mysql.com/doc/dev/mysql-server/latest/ |
按照数据结构来组织、存储和管理数据的仓库。
1 | select(listenfd+1, readfds, NULL, NULL, 0); // 一直阻塞。使用select,fd少,可以跨平台 |
系统ulimit -c大于0,一般设为unlimited,进程接收到异常信号后,默认是生成core文件,如果/proc/sys/kernel/core_pattern为core,则文件生成在进程的getcwd工作目录,如果/proc/sys/kernel/core_uses_pid为1,则core文件以pid结尾。
对于正在运行的进程,如果不想让进程退出,可以用gcore pid生成该进程的core文件。
对于代码中有对异常信号进行处理的情况,则接收到异常信号时,进入自定义的信号处理函数中,不再生成core文件,此时如果还想生成core文件,需要在处理函数末尾做如下处理:
1 | signal(signo, SIG_DFL); // 默认生成core文件 |
详细介绍miniupnp库的编译安装和使用方法,包括libminiupnpc客户端库的核心功能、端口映射配置技巧、NAT穿透实现原理。通过实际代码示例演示如何利用miniupnp实现自动端口转发,解决P2P应用中的内网访问问题,提升网络应用的连通性。
musl静态链接后,通过_Unwind_Backtrace某些架构无法获取到堆栈信息了,如arm32的SIGSEGV,libbacktrace是对其进行封装,所以也是如此。
使用http://musl.cc/下载的静态编译工具+libunwind同样无法获取到堆栈信息。
需要加入libunwind库的方法解决,具体如下。
参考:
https://cloud.tencent.com/developer/article/1173442
https://github.com/boostorg/stacktrace
https://www.boost.org/doc/libs/develop/doc/html/stacktrace.html
https://www.jianshu.com/p/58d32fbd8dfa
https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html
https://gitlab.alpinelinux.org/alpine/aports/-/blob/master/main/libunwind/musl-mips-fix.patch
https://datatracker.ietf.org/doc/html/rfc7540
https://www.nghttp2.org/documentation/
h2的优势:
需要先构造连接池对象,并完成初始化,连接池可以连接多个rpc服务器,从连接池取连接时会随机取不同服务器的连接,达到负载均衡的效果。
下图中为连接池里面使用的装饰者模式uml类图,从连接池中拿出的ITransportWrapper连接被PoolingTransport装饰后,close功能是自动放回连接池中,而不是真正的close掉连接,同样的,FakeTransport装饰后,IsOpen总是返回true,因为它是一个假冒的连接
连接池连接状态变更图如下,首先打开一个连接,打开成功进入BUSY状态,失败则进入DEAD状态,如果BUSY状态的连接使用过程中出现异常,也会进入DEAD状态。
TNonblockingServer使用的网络io模型为非阻塞同步io模型,accept由单个io线程处理,recv由多个io线程处理,相应的rpc事务处理由另外的线程池完成,处理完成后通知对应的io线程将处理结果进行send。
所有网络连接由ioThreads_[0]线程监听端口,在listenHandler中处理,accept后生成一个clientConnection,如果存在多个io线程,ioThreads_[0]线程通过robin算法从所有ioThreads_中选择一个io线程处理事务,即ioThreads_[0]通过pipe管道将clientConnection信息通知被选择的io线程,被选择的io线程此时会收到通知并处理notifyHandler,被选择的io线程在notifyHandler中将clientConnection信息读取出来,再进行recv数据并解析处理。