下面是我关闭套接字的方法:
LINGER lingerStruct;
lingerStruct.l_onoff = 1;
lingerStruct.l_linger = 0;
setsockopt(Clients[iClientID].ClientSocket, SOL_SOCKET, SO_LINGER, (char*)&lingerStruct, sizeof(lingerStruct));
CancelIo((HANDLE)Clients[iClientID].ClientSocket);
shutdown(Clients[iClientID].ClientSocket, SD_BOTH);
closesocket(Clients[iClientID].ClientSocket); // << Hangs here在大约2~10小时的运行时间和关闭超过500个套接字之后,随机套接字不想关闭,closesocket()在临界区永远挂起(使用调试器发现了这一点)。
我做错了什么?
编译器: Visual Studio 2010 SP1 (C++)操作系统: Windows Server 2008 R2 x64
谢谢。
发布于 2012-11-07 17:16:13
CancelIo函数不是同步的,或者至少在文档中没有保证它是同步的。如果该套接字上的I/O处于挂起状态,则应该等待,直到收到确认I/O已取消的完成通知(或者,可能在取消请求排队之前已成功完成)。
一旦收到完成通知,就可以安全地关闭套接字了。
发布于 2012-11-07 14:05:29
LINGER lingerStruct;
lingerStruct.l_onoff = 1;
lingerStruct.l_linger = 0;
setsockopt(Clients[iClientID].ClientSocket, SOL_SOCKET, SO_LINGER, (char*)&lingerStruct, sizeof(lingerStruct));把所有这些都扔掉。这对你没有任何好处,对同伴也没有任何好处。只需调用closesocket()并让TCP在其默认模式下工作。或者,您是否故意尝试在对等端造成数据丢失和重置?如果是这样,为什么呢?
CancelIo((HANDLE)Clients[iClientID].ClientSocket);我也很想摆脱它。关闭套接字应该会解决我所想的所有问题,但我不是异步I/O方面的专家。你可以尝试一下。
shutdown(Clients[iClientID].ClientSocket, SD_BOTH);把它扔掉。在closesocket()之前它是多余的。
https://stackoverflow.com/questions/13262841
复制相似问题