关于iocp完成端口的的探索!
首先声明,本人在学习阶段,所以所讲之处!难免会出错且啰嗦,本文旨在跟大家分享近期对iocp(window高并发服务器编程)的几点心得。大神欢迎大家喷我。
先为大家介绍一个c++高并发的大神群!
群主非常热情,而且技术实力雄厚。只要大家能虚心学习,群主每天群里分享面试以及编程经验。欢迎加入QQ群49114021 名字是高性能服务器开发 群主 范蠡³² 教授级大神。 本人仅仅群内潜水小鸟一个。请勿见笑。
**进入正题**
iocp网上基础介绍非常多。这里就不讲简单实现了。基础客户端 跟服务端模型 大家可以参考小猪的介绍。非常详细。
1.第一步 首先我写一个简单的服务端跟客户端模型,然后采用多开客户端的模式对客户端进行压力测试。(1MS一次发送了数据 客户端数量为20个)顺利到达发现瓶颈。当数据接收到一定速度的时候。会出现接收错误。
考虑一下几点,
1,tcp连接发送数据不是每次都把指定数据发送完成,而接收端也不一定每次都把需要接收的数据接收到位(粘包 分包。组包等问题。)
这个比较好解决。利用第二缓冲区接收数据,然后单独开辟线程进行异步消息处理即可.
原理 服务器自身接收缓冲区→(不间断直接取到我们自己建立的缓冲区)保证服务端本身接收缓冲区不会数据爆满而卡死(溢出)→从容不迫根据包头获取消息长度,解析出自己的数据。这样做可以很好的解决粘包粘包的问题。(我一般把第二缓冲区设置成当前缓冲区10倍。不知道有没问题)这是第一个服务器性能提升 的点。
2.第二步,利用高并发客户端对服务端进行压力测试
很意外。问题出现跟我想的不太一样。居然是AcceptEx 服务连接管理上
实际测试1秒内 10多个服务端接入服务端进入假死状态(本机127.0.0.1)(实际我客户端能模拟几秒10000+连接接入)客户端通过WSAGetLastError()函数获取错误代码 10061
为什么会这样呢,通过多方调查取证,发现当短时间内大力连接发起的时候AcceptEx到达性能上限。这是一个需要研究的地方(正在攻关中…无法提供任何思路。详情请关注本人后续博客。)
3.第三个点写个刚入门跟我一样的小白菜。你是否发现,当ping自己服务器的时候服务端直接崩溃?(错误数据包的处理)
4.传自定义数据,这是我接触到网络编程的第一个问题(当时我直接传的字符串数据。)群主告诉我的办法是传结构体,封装到一个具体的自定义结构内。(犹记当年,群主11点多语音给我讲解,现在想想现在这样的大神真难得。)这个涉及到内存复制,具体方法 包头+结构体,包头的作用主要是记录结构体内数据长度,服务端先接收包头 然后通过包头判断后续数据长度!再将后续指定接收长度的数据转换为结构头(这里涉及到 内存对齐,其实很简单 服务端跟客户端代码前面加上
pragma pack(push, 1) //结构体对齐
struct MsgStuct
{
int packagelength;
int i;
long long n这里写代码片
;
const char *msg;
};
pragma pack(pop)
这样过去的数据就不会乱
使用自定义数据结构的好处是如果发送跟接收端都是C++的话 那么效率非常搞!坏处就是如果 客户端是C# java那就尴尬了
所以我又琢磨了一个新方法
字节流!
这个比较复杂 下次来讲
郑重申明!欢迎进群一起讨论交流。或者直接留言 我都会看以及恢复!