IOCP编程注意事项

IOCP--Windows服务器编程                                                                              一对于IOCP,搞Windows服务器编程的都不会陌生,它所表现出来的性能是其他各种WinSock模型难望其项背的。撰写本文的目的就是为让大家能够在深入理解IOCP的基础上,再来深入的挖掘Windows系统的性能。此处假设读者对IOCP模型已 阅读详情


虽说我的昵称是EasyIOCP,但是用好IOCP还是不容易的,有很多要注意的地方,长话短说(不涉及细节):
 
      1、每个连接同时最好只有一个待决的WSARecv。IOCP不保证多个待决WSARecv情况下先投递的WSARecv就一定会先得到完成通知。因此

,多个待决WSARecv可能导致数据乱序,无谓增加代码复杂性。
 
      2、投递0长度缓冲区的WSARecv可以不占用非分页内存,避免WSAENOBUFS错误。
 
      3、每个连接同时最好只有一个待决的WSASend。发送数据会锁定系统费非分页内存,过多的WSASend会导致WSAENOBUFS错误,麻烦的事

情。
 
      4、WSASend直接返回成功,说明数据已复制到发送缓冲区;若WSA_IO_PENDING,则当得到完成通知时,不会出现只发送部分数据的情

况(本人未具体研究,只是别人看了泄露的NT4.0的代码的得到的结论,为了万全,还是要考虑发送部分数据的情况,若出现发送部分数据情

况,那么一个连接投递多个WSASend就不行了,投递WSASend相当于追加发送缓冲区,滑动窗口未必会一次性更新)。
 
      5、IOCP是为响应大规模并发连接,做到了1、2、3和4能够尽可能的增加连接并发数量:因为并发数量很大程度是由非分页内存的占用

量决定的。
 
      6、服务端应该提供强制关闭和优雅关闭连接功能。推荐使用强制关闭,以避免socket的TIME_WAIT状态。
 
      7、多多利用DisconnectEx函数实现socket 重用,因为socket的分配是有代价的。
 
      8、当socket资源被释放后,若不存在TIME_WAIT状态,要警惕系统立即把该socket值分配给新的连接,这就导致资源释放与新旧

socket资源同步问题。建议socket出错后,先释放相关资源,再closesocket或者DisconnectEx。
 
      9、DisconnectEx不能实现强制关闭:即使设置SO_LINGER选项,DisconnectEx也不会发出RST,只有FIN。
 
      10、当新建一个连接后,要对新的socket设置SO_UPDATE_ACCEPT_CONTEXT选项,否则对其的shutdown和DisconnectEx会有WSAENOTCONN错误,算是个bug。
 
      11、这个和强制关闭有关:取消已经投递的IO操作,可以使用的函数有CancelIO和CancelIOEx,具体区别参见MSDN。要注意,CancelIOEx需要Windows Server 2008及以上、Windows Vista及以上。


      12、考虑提供接收和发送紧急数据的接口。


      13、Overlapped(重叠)方式类似于zero-copy:直接锁定用户buffer至非分页内存。

      14、调用DisconnectEx()成功后,socket仍然和先前的绑定的完成建一一对应,除非使用closesocket()。

       15、当然直接closesocket()也可以取消已投递的IO操作,但是要注意到资源同步的问题、可能发生的socket资源再分配问题。

       16、GetQueuedCompletionStatusEx()是个好函数:一次调用尽可能多的获得完成通知,减少用户态和内核态之间的切换。

游戏服务器编程-iocp及封包处理 测试服务器:凑合着先用,就一个进程,没做分布式,界面是win32api做的很简易。 阅读详情

相关推荐

实战解析:从Innovus到Calibre的LVS错误排查全流程

本文详细解析了从Innovus到Calibre的LVS错误排查全流程,涵盖物理验证关键步骤与工具链协同。通过实战案例分享,重点解决器件不匹配、连接性错误等常见问题,并提供GDS导出规范、网表修正策略等实用技巧,帮助工程师高效完成芯片设计物理验证。

9o8p7i6u5y的博客 1038

[win32] Winsock 中应使用 DisconnectEx 关闭连接

在 maillist 上看到一则讯息,使用 closesocket() 只是让 OS 回收你的 socket,其实并没有给对方(peer)发送 FIN。因此对方(peer)在下次 recv() 的时候,会收到 "reset by peer" 的错误。 而要主动给对方(peer)发送 FIN,要使用 DisconnectEx() 函数。而 MSDN 告知,DisconnectEx() 函数

pud_zha的专栏 1830

网络设备调试指南:如何用MDIO Clause22/45协议读写Marvell MV88E6390寄存器

本文深入解析了如何通过MDIO Clause 22/45协议对Marvell MV88E6390交换芯片进行寄存器读写调试。文章详细对比了两种协议的本质区别与适用场景,并重点阐述了MV88E6390的直接与间接寻址策略,提供了实战代码示例与关键调试技巧,帮助网络工程师高效解决配置与通信问题。

tequila的博客 519

DisconnextEx 函数

DisconnextEx 函数允许关闭一个socket连接,并可以把这个socket句柄当作参数传给 AcceptEx ConnectEx重用这个socket句柄。 函数原型: BOOL DisconnectEx(   __in          SOCKET hSocket,   __in          LPOVERLAPPED lpOverlapped,   __in     

酷酷的鱼 - 网络编程,服务器安全专栏 1720

YOLOv8 置信度阈值 (conf) 和 IoU 阈值 (iou) 详解:如何平衡漏检与误检?

摘要 本文深入探讨了YOLOv8目标检测模型中两个关键参数——置信度阈值(conf)和IoU阈值(iou)的核心作用。文章从目标检测的基础概念出发,解释了置信度分数反映模型预测可靠性,IoU衡量预测框重叠程度。重点剖析了非极大值抑制(NMS)机制如何通过这两个阈值进行预测框筛选:置信度阈值作为初筛门槛,IoU阈值决定重叠框的取舍。通过生动比喻和可视化图表,阐述了合理调节这两个参数能有效平衡误检与漏检问题,是优化YOLOv8模型实际表现的重要技巧。全文以实践为导向,帮助开发者掌握成为"调参大师&qu

深耕 Vue 生态与 JS/TS 技术,聚焦组件封装、响应式原理、TS 类型设计,解析工程化配置与性能优化方案。同时分享 YOLOv8 目标检测实战、AI 大模型面试核心考点,以代码实例拆解技术实现与业务解法。 1254

Python爬虫实战:股票历史数据抓取与量化回测全流程详解

我们以**东方财富网(eastmoney.com)和雪球网(xueqiu.com)**为主要目标,演示如何爬取A股历史行情。最常用的HTTP请求库,简单易用,适合静态页面数据请求。本文详细介绍了从股票历史数据抓取到简单回测的完整流程,代码示例基于最新技术,结构清晰,适合初学者和进阶者学习量化投资实战。希望对你入门Python爬虫和量化交易有所帮助!

2201_76125261的博客 1782

IOCP5: shutdown,WSASendDisconnect,DisconnectEx

1.::shutdown(s,SD_SEND); 表示禁止本地再发送数据到对端,并且,请求对方断开,如果对方不断开,本地套接字将处于FIN_WAIT_2状态,异步等待一段时间,时间到了之后,本地将主动断开连接,GetQueuedCompletionStatus将会返回,WSASend,WSARecv等函数的调用也都将失败,但socket资源并没有回收,仍需调用closesocket来释放套接字占

nondeep的专栏 2854

22、计算智能在自闭症检测与管理中的应用

本文探讨了计算智能在自闭症谱系障碍(ASD)检测与管理中的应用。在检测方面,结合可穿戴设备、传感技术与多模态数据(如眼动追踪、问卷、神经成像等),利用机器学习和深度学习算法提升诊断准确性,并介绍了多种公开数据集及研究方法。在管理方面,通过生理指标(HRV、GSR、呼吸频率)监测情绪状态,结合智能可穿戴设备与支持性应用平台(如LetMeTalk、MITA、Rethink Ed等),实现对ASD患者的实时干预与个性化支持。文章还展示了多模态筛查与管理流程的系统架构,强调未来技术整合与个性化服务的发展方向。

star的博客 91

WinSock Socket 池

之前在WinSock2.0 API 中说到,像DisConnectEx 函数这样,它具有回收SOCKET的功能,而像AcceptEx这样的函数,它不会自己在内部创建新的SOCKET,需要外部传入SOCKET作为传输数据用的SOCEKT,使用这两个函数,我们可以做到,事先创建大量的SOCKET,然后使用AcceptEx函数从创建的SOCKET中选择一个作为连接用的SOCKET,在不用这个SOCKET...

Masimaro的专栏 524

YOLOv11改进,YOLOv11添加ASFF检测头,并添加小目标检测层(四头检测),适合目标检测、分割等任务,全网首发

YOLOv11改进,YOLOv11添加ASFF检测头,并添加小目标检测层(四头检测),适合目标检测、分割等任务,全网首发

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 4735

【用unity实现100个游戏之7】实现一个类《杀戮尖塔》的卡牌回合制游戏(附项目源码)

【用unity实现100个游戏之7】实现一个类《杀戮尖塔》的卡牌回合制游戏(附项目源码)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1万+

WIN网络编程-IOCP服务程序设计注意事项

IOCP服务程序设计注意事项1、内存资源管理  每个重叠的发送或接收操作所提交的数据缓冲区很可能会锁定。内存被锁定之后,它不能从物理内存换出。但操作系统对锁定内存的数量(不是投递的操作数量)有限制,如果服务器预期处理大量的并发客户,可以在每个连接上投递一个0字节的接收操作,这样不会有内存锁定。0字节的接收操作完成后,服务器可以简单执行一个非阻塞的接收来获取缓存内部SOCKET接收缓冲区中的

深未来技术 533

H3C BGP联盟实验

bgp,bgp联盟,bgp公认团体属性,

一只懒羊羊 971

IOCP 学习例子

IOCP完成端口例子代码: // IoPort.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #pragma comment(lib,"ws2_32.lib") #include "Win32NetWork.h" #include #include //微软扩展的类库 typedef BOOL (* LPFN_Acc

ab7936573的专栏 831

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IOCP advanced

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34364135的博客 142

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

网络编程:IOCP及关键网络API的使用

CreateIoCompletionPort、AcceptEx、ConnectEx、DisconnectEx、WSARecv、WSASend、GetQueuedCompletionStatus

平平无奇的小甜菜 1192

VC++ IOCP DEMO 高并发含服务端客户端

VC++ IOCP DEMO 高并发含服务端客户端 去发现同类优质开源项目:https://gitcode.com/ 此仓库提供了基于VC++的高并发网络编程示例,包含了服务端和客户端的实现。此DEMO采用IOCP(完成端口)模型,能够有效处理大量并发连接,保证了程序的稳定运行。通过此示例,您可以了解到如何在VC++中实现高效的网络通信,适用于需要高并发处理的服务器端应用开发。 文件结构 Ser...

gitblog_06781的博客 411
下一篇: cin的错误标记和缓冲区清空
HardIOCP
博客等级 码龄16年 7粉丝 13原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值