没有合适的资源?快使用搜索试试~ 我知道了~
首页可以承载20k并发量的IOCP
资源详情
资源评论
资源推荐
对于开发一款高性能服务器程序,广大服务器开发人员在一直为之奋斗和努力.其中一个影响
服务器的重要瓶颈就是服务器的网络处理模块.如果一款服务器程序不能及时的处理用户的
数据.则服务器的上层业务逻辑再高效也是徒劳.所以一个服务器程序的网络处理能力直接影
响到整个服务器的性能, 本文主要介绍在 windows 平台下开发高性能的网络处理模块以及
自己在设计开发服务器网络模块遇到的一些问题和开发心得.本篇主要介绍 TCP 服务器的设
计, 下一篇将主要介绍 UDP 服务器的设计.
众所周知, 对于服务器来说 windows 下网络 I/O 处理的最佳方式就是完成端口, 因此本服
务器的开发主要基于完成端口的模式.完成端口(completion port)是应用程序使用线程池处
理异步 I/O 请求的一种机制.将创建好的 socket 和完成端口绑定后就可以向该 socket 上投递
相应的 I/O 操作, 当操作完成后 I/O 系统会向完成端口发送一个通知包;应用程序通过
GetQueuedCompletionStatus()函数获取这些通知包并进行相应的处理.下面切入正题谈谈 TCP
服务器的开发.
本人在开发 TCP 服务器的经过了两个阶段, 第一次设计出来的 TCP 服务器网络层只能支持
5000 – 8000 个在线用户同时和服务器交互, 但是会出现一些莫名其妙的系统异常.所以网
络层不是很稳定.这次开发主要用到一个系统的 I/O 线程池函数 BindIoCompletionCallback()
该函数在 win2000 以后都支持, BindIoCompletion-
Callback()是一个 I/O 线程池函数,其主要功能是采用系统线程池进行 I/O 处理,优点是用户无
需自己创建完成端口和线程池,完成端口和工作者线程池的创建和管理都由系统维护.给用户
带 了 很 大 的 方 便 . 用 户 只 需 要 将 自 己 创 建 的 socket 和 I/O 回 调 函 数 传 递 给
BindIoCompletionCallback()函数即可, 然后就可以在该 socket 上投递相应的操作.当操作完成
后系统会调用用户的回调函数通知用户.这种方式给开发者带来了很大的方便, 开发者甚至
不需要去了解完成端口的工作机制就可以开发出一个较高性能的网络程序.但同时也带来了
很多麻烦,用户无法知道在完成端口上到底有多少个工作者线程, 而且当连接到服务器上的
用户量过大时会出现线程堆栈错误等异常,同时有 1000-2000 个用户断开连接后, 服务器就
无法让后续用户连接到服务器. 在这种方式下的服务器网络层最多只支持 4000 – 5000 用
户同时连接到服务器.用户量再大时就会出现一些系统异常而且无法解决.
借鉴于第一次开发的经验和教训, 在第二次开发服务器 TCP层时决定自己创建完成端口和
工作者线程池, 并对其进行维护和管理.这样做的好处是出了问题好定位和处理.下面将我开
发的代码拿出来和大家切磋切磋, 如果什么地方写得问题还希望能够指正出来, 欢迎邮件联
系我: siqiang0312@163.com, QQ: 24633959, MSN: beifangying@hotmail.com
1. 首先介绍网络上下文(NET_CONTEXT)的定义:
class NET_CONTEXT
{
public:
WSAOVERLAPPED m_ol;
SOCKET m_hSock;
CHAR* m_pBuf; //接收或发送数据的缓冲区
INT m_nOperation; //在该网络上下文上进行的操作 OP_ACCEPT…
static DWORD S_PAGE_SIZE; //缓冲区的最大容量
NET_CONTEXT();
virtual ~NET_CONTEXT();
static void InitReource();
static void ReleaseReource();
private:
void* operator new (size_t nSize);
void operator delete(void* p);
static HANDLE s_hDataHeap;
static vector<char * > s_IDLQue; //无效数据缓冲区的队列
static CRITICAL_SECTION s_IDLQueLock; //访问 s_IDLQue 的互斥锁
};
NET_CONTEXT 是所有网络上下文的基类, 对于 TCP 的 recv, send, accep, connect 的上下文都
继承自该类.UDP 的 send 和 recv 的网络上下文也继承自该类. m_ol 必须放置在第一个位置否
则当从完成封包取 net_context 不能得到正确的结果. S_PAGE_SIZE 为数据缓冲区 m_pBuf 的
大小,其大小和相应的操作系统平台有关, win32 下其值为 4096, win64 下其值为 8192, 即为操
作系统的一个内存页的大小.设置为一个内存页的原因是因为在投递重叠操作时系统会锁定
投递的缓冲区, 在锁定时是按照内存页的边界来锁定的.因此即使你只发送一个 1K 字节数据
系统也会锁定整个内存页(4096/8192). s_hDataHeap 为自定义的 BUF 申请的堆.其优点是用
户可以 自己对 堆进行 管理 和操作. s_IDLQue 为用 过的 BUF 队列, 当用户 用完 相应的
NET_CONTEXT 后在执行析构操作时并不会真正把 m_pBuf 所占的内存释放掉而是将其放入到
s_IDLQue 队列中, 当下次申请新的 NET_CONTEXT 时只需从 s_IDLQue 中取出就可以使用, 避
免频繁的 new 和 delete 操作.
2. 数据包头的定义:
struct PACKET_HEAD
{
LONG nTotalLen; //数据包的总长度
ULONG nSerialNum; //数据包的序列号
WORD nCurrentLen; //当前数据包的长度
WORD nType; //数据包的类型
};
数据包头位于每一个接收到的或待发送的数据包的首部,用于确定接收到的数据包是否合法
以及该数据包是做什么用的.用户可以定义自己包头.
3. TCP_CONTEXT 主要用于定义接收和发送数据的缓冲区, 继承自 NET_CONTEXT
class TCP_CONTEXT : public NET_CONTEXT
{
friend class TcpServer;
protected:
DWORD m_nDataLen; //TCP 模式下累计发送和接收数据的长度
TCP_CONTEXT()
: m_nDataLen(0)
{
}
virtual ~TCP_CONTEXT() {}
void* operator new(size_t nSize);
void operator delete(void* p);
enum
{
E_TCP_HEAP_SIZE = 1024 * 1024* 10,
MAX_IDL_DATA = 20000,
};
private:
static vector<TCP_CONTEXT* > s_IDLQue; //无效的数据队列
static CRITICAL_SECTION s_IDLQueLock; //访问 s_IDLQue 的互斥锁
static HANDLE s_hHeap; //TCP_CONTEXT 的数据申请堆
};
TCP_CONTEXT 类主要用在网络上发送和接收数据的上下文.每个连接到服务器的 SOCKET 都
会有一个发送和接收数据的 TCP_CONTEXT.这里重载了 new 和 delete 函数.这样做的优点在于
当申请一个新的 TCP_CONTEXT 对象时会先判断无效的数据队列中是否有未使用的
TCP_CONTEXT,若有则直接取出来使用否则从 s_hHeap 堆上新申请一个.new 函数的定义如下
void* TCP_CONTEXT::operator new(size_t nSize)
{
void* pContext = NULL;
try
{
if (NULL == s_hHeap)
{
throw ((long)(__LINE__));
}
//为新的 TCP_CONTEXT 申请内存, 先从无效队列中找, 如无效队列为空则从堆上申请
EnterCriticalSection(&s_IDLQueLock);
vector<TCP_CONTEXT* >::iterator iter = s_IDLQue.begin();
if (iter != s_IDLQue.end())
{
pContext = *iter;
s_IDLQue.erase(iter);
}
else
{
pContext = HeapAlloc(s_hHeap, HEAP_ZERO_MEMORY | HEAP_NO_SERIALIZE, nSize);
}
LeaveCriticalSection(&s_IDLQueLock);
剩余45页未读,继续阅读
打不赢jiu跑
- 粉丝: 6
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 2023年中国辣条食品行业创新及消费需求洞察报告.pptx
- 2023年半导体行业20强品牌.pptx
- 2023年全球电力行业评论.pptx
- 2023年全球网络安全现状-劳动力资源和网络运营的全球发展新态势.pptx
- 毕业设计-基于单片机的液体密度检测系统设计.doc
- 家用清扫机器人设计.doc
- 基于VB+数据库SQL的教师信息管理系统设计与实现 计算机专业设计范文模板参考资料.pdf
- 官塘驿林场林防火(资源监管)“空天地人”四位一体监测系统方案.doc
- 基于专利语义表征的技术预见方法及其应用.docx
- 浅谈电子商务的现状及发展趋势学习总结.doc
- 基于单片机的智能仓库温湿度控制系统 (2).pdf
- 基于SSM框架知识产权管理系统 (2).pdf
- 9年终工作总结新年计划PPT模板.pptx
- Hytera海能达CH04L01 说明书.pdf
- 数据中心运维操作标准及流程.pdf
- 报告模板 -成本分析与报告培训之三.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论5