当前位置:  开发笔记 > 编程语言 > 正文

如何检查客户端是否通过C++中的Winsock断开连接?

如何解决《如何检查客户端是否通过C++中的Winsock断开连接?》经验,为你挑选了2个好方法。

如何检查客户端是否通过C++中的Winsock断开连接?



1> sfossen..:

Beej的网络编程指南

如果你在阻塞模式下调用recv并且它返回0字节读取,则套接字已断开连接,否则它等待接收字节.

请看这个FAQ 2.12

示例来自此页面上的选择.

int nRet;

if(( nRet = select( 0, &fdread, NULL, NULL, NULL )) == SOCKET_ERROR )
{
    // Error condition
    // Check WSAGetLastError
}

if( nRet > 0 )
{
    // select() will return value 1 because i m using only one socket
    // At this point, it should be checked whether the
    // socket is part of a set.

    if( FD_ISSET( s, &fdread ))
    {
        // A read event has occurred on socket s
    }
}



2> Len Holgate..:

您只能通过尝试发送数据来判断TCP套接字是否"已断开连接".这是因为协议的设计应该允许在对等体之间暂时中断.因此,如果您从A通过R1经过R2连接到B并发送数据一段时间然后停止发送,您可以拔掉R2-> R3(例如),A和B都不会注意到(或小心).如果您然后插入R2-> R4和R4-> R3,然后尝试在A和B之间发送数据,那么事情就会"正常工作"而您永远不会知道.但是,如果您在R2-> R3断开连接时尝试发送数据,那么您(最终在所有TCP级别重试之后)会收到错误.

现在,某些操作系统可能会提醒您当前网络适配器当前未连接的事实,您可以使用它来说"我不再与我的同行连接",但我不建议.

如果让对等方知道什么时候连接被"断开"很重要,那么要么使用应用程序级别的"ping"消息来偶尔在对等体之间发送数据,要么使用TCP keep-alive.就个人而言,我会去ping消息......

编辑:当然所有这一切都假设您想知道您是否仍然可以在连接上发送数据,毕竟,当客户端不再发送时您已经完成了因为您的读取将返回0字节并且您知道何时断开连接它的发送方是因为你的写入会失败; 你也知道什么时候关闭你自己的连接端的发送或接收端...

我想我应该坚持使用"define disconnected"的初始肠道反应响应;)

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有