【发布时间】:2019-01-03 12:48:59
【问题描述】:
在忙于在重叠模式下使用 Windows 套接字并使用完成例程(因此没有 IOCP)进行反馈时,我发现了以下奇怪的案例:
- 使用
listen和AcceptEx打开服务器套接字。 - 使用
ConnectEx在所述端口上连接客户端套接字
我们现在(至少)有 3 个套接字:1 个列表套接字、一个客户端连接套接字和一个服务器连接套接字。
在传输一些数据后,我们使用shutdown 关闭服务器和客户端连接的套接字。在这一步之后,两个套接字都用closesocket关闭。
目前:为了确保我们没有待处理的完成例程,我发出以下(伪代码):
而 SleepEx(0, TRUE) == WAIT_IO_COMPLETION 做;
我想现在释放WSARecv 和WSASend 使用的OVERLAPPED 结构的内存会省事。
在线程再次进入警报状态的那一刻之后,另一个完成例程回调为服务器连接的套接字执行错误 10053,但使用我们刚刚释放的 OVERLAPPED 结构。这是free后的内存使用情况。
问题:
您什么时候可以确定不再使用完成例程为使用重叠 IO 的套接字发出完成回调?
【问题讨论】:
-
@RbMm:这里没有 IOCP。
-
@BenVoigt - 但是
AcceptEx和ConnectEx怎么样?在异步模式下使用它的唯一方法 - 为 iocp 绑定套接字。不清楚 OP 在做什么 -
@RbMm:你可以在没有完成端口的情况下进行异步 I/O。
-
@BenVoigt - 依赖于 api。
AcceptEx和ConnectEx只允许使用 iocp 异步。此 api 没有 APC 选项,这里没有回调作为参数。不是 ?或 OP 使用同步AcceptEx和ConnectEx? -
@RbMm:没有回调,但在重叠结构中有一个事件句柄。而导致他问题的实际操作是
WSARecv,它确实有一个回调参数。
标签: windows sockets overlapped-io