【发布时间】:2018-02-15 16:22:58
【问题描述】:
我了解,如果我按照文档建议通过函数指针发出 AcceptEx 调用,那么如果我指定接收器缓冲区大小,则调用将在发送一些数据之前不会完成:
if (!lpfnAcceptEx(sockListen,
sockAccept,
PerIoData->Buffer,
DATA_BUFSIZE - ((sizeof(SOCKADDR_IN) + 16) * 2), /* receive buffer size */
sizeof(SOCKADDR_IN) + 16,
sizeof(SOCKADDR_IN) + 16,
&dwBytes,
&(PerIoData->Overlapped)
))
{
DWORD dwLastError = GetLastError();
// Handle error
}
来自MSDN
如果提供了接收缓冲区,重叠操作将不会 完成,直到接受连接并读取数据。使用 带有 SO_CONNECT_TIME 选项的 getsockopt 函数检查是否存在 已接受连接。
如果套接字未连接,getsockopt 返回 0xFFFFFFFF。 检查重叠操作是否存在的应用程序 完成,结合 SO_CONNECT_TIME 选项,可以 确定连接已被接受但没有数据 收到了。
建议通过关闭 接受的套接字,它强制完成 AcceptEx 函数调用 有错误。
现在,这似乎表明我应该强制关闭套接字。但是,我的书“Microsoft Windows 的网络编程 - 第二版”陈述了类似的事实,但接着说
作为一个警告,应用程序不应在任何情况下 关闭在 AcceptEx 调用中使用的客户端套接字句柄,该句柄尚未 被接受,因为它可能导致内存泄漏。为了表现 原因,与 AcceptEx 调用关联的内核模式结构 未连接的客户端句柄关闭时不会被清理 直到建立新的客户端连接或直到监听 套接字已关闭。
所以我不现在应该关闭它??我很困惑。
两个问题:
1) 如果一个套接字还没有完全完成AcceptEx,我会从getsockopt 得到0xFFFFFFFF。这使其成为强制关闭的候选者。但是我怎么知道它在这种状态下坐了多久呢?我无法添加自己的计时逻辑,因为我的完成端口例程尚未完成,所以我不知道何时进行了接受!
2) 当我确定是否需要关闭套接字时,我该怎么做? closesocket()够了吗?
【问题讨论】:
标签: sockets winsock winsock2 iocp