如何强制系统关闭底层套接字

WindowsSDK编程,调用closesocket有可能会返回失败,关闭不成功,而我也不能无限期等待成功调用closesocket才结束线程,因此需要一种方法强制系统关... Windows SDK 编程,调用 closesocket 有可能会返回失败,关闭不成功,而我也不能无限期等待成功调用 closesocket 才结束线程,因此需要一种方法强制系统关闭当前套接字。说明一下,我的进程不能结束,所以不能依靠结束进程来释放所有资源。我的项目也不适合搞心跳包机制。所以必须能强制关闭套接字,让对端在收发数据不成功时能判断出我这边已经断开。 展开
 我来答
DoramiHe
2018-02-13 · 知道合伙人互联网行家
DoramiHe
知道合伙人互联网行家
采纳数:25335 获赞数:59535
2011年中山职业技术学院毕业,现担任毅衣公司京东小二

向TA提问 私信TA
展开全部

我们在利用IOCP(完成端口)进行程序设计的时候,经常要关闭一些不满足条件的套接字。假如我们直接采用closesocket方法进行关闭的话,绑定到IO端口的此套接字的未发送的数据就会丢失,这种情况是我们不愿意发生的。下面介绍一种合理关闭此套接字的方法:
首先,利用setsockopt(MSDN)函数设定套接字的选项,我们把此套接字设定为:假如有数据未发送,当数据发送完后再关闭此套接字。

步骤/方法

  • 1

    代码如下:
    LINGER lingerStruct;
    lingerStruct.l_onoff = 1;
    lingerStruct.l_linger = 0;
    setsockopt(Socket, SOL_SOCKET, SO_LINGER,
    (char *)&lingerStruct, sizeof(lingerStruct) );
    //

  • 2

    // Now close the socket handle. This will do an abortive or graceful close, as requested.
    CancelIo((HANDLE) Socket);
    closesocket(Socket);
    clientSocket = INVALID_SOCKET;

  • 3

    当在完成端口的数据被发送出去之后,套接字就会被关闭,这样我们就完成了一个套接字的关闭。

空你几哇kbw
2018-02-13 · TA获得超过349个赞
知道答主
回答量:722
采纳率:6%
帮助的人:68.5万
展开全部
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式