首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >closesocket()偶尔冻结一次

closesocket()偶尔冻结一次
EN

Stack Overflow用户
提问于 2012-11-07 11:43:20
回答 2查看 901关注 0票数 1

下面是我关闭套接字的方法:

代码语言:javascript
复制
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

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2012-11-07 17:16:13

CancelIo函数不是同步的,或者至少在文档中没有保证它是同步的。如果该套接字上的I/O处于挂起状态,则应该等待,直到收到确认I/O已取消的完成通知(或者,可能在取消请求排队之前已成功完成)。

一旦收到完成通知,就可以安全地关闭套接字了。

票数 1
EN

Stack Overflow用户

发布于 2012-11-07 14:05:29

代码语言:javascript
复制
LINGER lingerStruct;
lingerStruct.l_onoff = 1;
lingerStruct.l_linger = 0;
setsockopt(Clients[iClientID].ClientSocket, SOL_SOCKET, SO_LINGER, (char*)&lingerStruct, sizeof(lingerStruct));

把所有这些都扔掉。这对你没有任何好处,对同伴也没有任何好处。只需调用closesocket()并让TCP在其默认模式下工作。或者,您是否故意尝试在对等端造成数据丢失和重置?如果是这样,为什么呢?

代码语言:javascript
复制
CancelIo((HANDLE)Clients[iClientID].ClientSocket);

我也很想摆脱它。关闭套接字应该会解决我所想的所有问题,但我不是异步I/O方面的专家。你可以尝试一下。

代码语言:javascript
复制
shutdown(Clients[iClientID].ClientSocket, SD_BOTH);

把它扔掉。在closesocket()之前它是多余的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13262841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档