完成端口(IOCP)怎么判断某个连接是否断开

本文探讨了使用完成端口进行网络通信时的一种常见断线判断方法:通过*lpNumberOfBytes==0来检测连接是否断开。作者在实践中发现这种方法并不完全可靠,即使*lpNumberOfBytes为0,在某些情况下仍能通过recv函数接收到数据。因此,提出了一种改进方案,即当*lpNumberOfBytes为0时再次尝试接收数据,若仍然无法接收则判定为断线。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

完成端口函数:

BOOL GetQueuedCompletionStatus(

  HANDLE CompletionPort,

  LPDWORD lpNumberOfBytes,

  PULONG_PTR lpCompletionKey,

  LPOVERLAPPED* lpOverlapped,

  DWORD dwMilliseconds

);

1.通常做法

目前查了大部分网上的关于完成端口,是否连接断线,大多是通过*lpNumberOfBytes==0来判断是否有连接断线的.之前我也是这么做的.但在实际游戏平台运行过程中,偶尔有游戏玩家反映,为什么我玩着玩着就断线了,由于网络原因复杂,并没有对此判断表示过怀疑.

2.发现问题

今天在调试网络部分代码,,发现有些时候*lpNumberOfBytes==0,但是再调用nCount = recv函数去收数据,竟然可以收到数据(nCount >0),反复测试了好几次,多是如此,那表明dwThancferred==0的时候,并不表示连接已经断开.

3.解决问题

从上述发现的问题可以看到,*lpNumberOfBytes==0时,再用nCount = recv去读取下数据,如果还是未读取到数据(nCount==0),那么就判断这个连接已经断开.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值