ngl_server 1.0
基于 Actor 模型的 C++ 服务器框架
net_session.h File Reference

声明socket会话ID范围的辅助函数。 More...

#include "actor/tab/csvtable.h"
#include "tools/type.h"
#include <limits>

Enumerations

enum  : i32_sessionid { ngl::net_session::session_begin_tcp = 1 , ngl::net_session::session_begin_ws = 0x10000000 }
 会话ID起始值枚举。 More...

Functions

constexpr i32_sessionid ngl::net_session::begin (ENET_PROTOCOL aprotocol)
 获取指定协议的会话ID起始值。
constexpr i32_sessionid ngl::net_session::end (ENET_PROTOCOL aprotocol)
 获取指定协议的会话ID结束值。
template<typename FOCCUPIED>
bool ngl::net_session::next (i32_sessionid &asessionid, ENET_PROTOCOL aprotocol, FOCCUPIED &&aoccupied)
 生成下一个可用的会话ID(环绕复用 + 占用跳过)。
constexpr ENET_PROTOCOL ngl::net_session::protocol (i32_sessionid asessionid)
 根据会话ID识别网络协议类型。

Detailed Description

声明socket会话ID范围的辅助函数。

本文件提供了网络会话ID的管理功能,包括:

  • 定义不同网络协议的会话ID起始范围
  • 获取会话ID的起始和结束值
  • 生成下一个可用的会话ID
  • 根据会话ID识别网络协议类型

会话ID用于唯一标识网络连接,不同协议使用不同的ID范围以避免冲突。

Enumeration Type Documentation

◆ anonymous enum

anonymous enum : i32_sessionid

会话ID起始值枚举。

定义不同网络协议的会话ID起始范围,确保不同协议的会话ID不会冲突。

Enumerator
session_begin_tcp 

TCP协议会话ID起始值

session_begin_ws 

WebSocket协议会话ID起始值

Function Documentation

◆ begin()

i32_sessionid ngl::net_session::begin ( ENET_PROTOCOL aprotocol)
constexpr

获取指定协议的会话ID起始值。

Parameters
aprotocol网络协议类型
Returns
该协议的会话ID起始值,如果协议无效返回0

◆ end()

i32_sessionid ngl::net_session::end ( ENET_PROTOCOL aprotocol)
constexpr

获取指定协议的会话ID结束值。

Parameters
aprotocol网络协议类型
Returns
该协议的会话ID结束值,如果协议无效返回0

◆ next()

template<typename FOCCUPIED>
bool ngl::net_session::next ( i32_sessionid & asessionid,
ENET_PROTOCOL aprotocol,
FOCCUPIED && aoccupied )
inline

生成下一个可用的会话ID(环绕复用 + 占用跳过)。

在协议范围 [begin, end] 内单调递增分配,到达上限后绕回起始值, 并跳过 aoccupied 判定为仍在使用的ID,从而实现会话ID的循环复用, 避免长期运行后32位ID耗尽。仅当整个区间被并发连接占满时才返回false。

Note
由于一个ID要被复用必须先走完整个区间(TCP约2.68亿), 几乎不存在迟到旧连接报文落到刚复用同ID新连接上的ABA问题。
调用方需在持有会话表锁的前提下调用,aoccupied 读取该会话表。
Template Parameters
FOCCUPIED形如 bool(i32_sessionid) 的可调用对象,返回该ID是否仍被占用
Parameters
asessionid输入输出参数,上次分配的会话ID,成功时更新为本次分配的ID
aprotocol网络协议类型
aoccupied占用判定回调,返回true表示该ID仍在使用、需跳过
Returns
成功分配返回true,区间被占满返回false

◆ protocol()

ENET_PROTOCOL ngl::net_session::protocol ( i32_sessionid asessionid)
constexpr

根据会话ID识别网络协议类型。

通过会话ID的范围判断其所属的网络协议类型。

Parameters
asessionid会话ID
Returns
对应的网络协议类型,如果ID不在任何协议范围内返回ENET_NULL