www.3112.net > C++ soCkEt 服务器怎么判断客户端已经断开连接

C++ soCkEt 服务器怎么判断客户端已经断开连接

你可以根据服务器收到的数据的长度来判断,如果服务器收到的数据长度是0,那么意味着你的客户端程序已经断开了连接.从TCP/IP协议栈的角度来说,就是客户端程序关闭了自己写的这一半连接,向服务器发出了一个FIN.这涉及到TCP的状态迁移,关于这方面的知识,建议你看一下Richard Stevens先生的《TCP/IP 详解》卷一和《Unix网络编程》卷一,上面有详细的解释.关于你的第二个问题,建议你仔细看一下自己的服务器程序代码.服务器程序首先要建立一个监听socket,当有客户端连接上来时,服务器会在一个新socket上接受客户端连接.所以并不存在“乱”的问题.关于这个问题同样推荐你看上面的两本关于网络编程的经典著作.

服务端肯定持有这个客户端的socket,调用这个对象的close方法就行了.

传统方法是设置心跳包,就是确定一定时间就进行通讯一次.如果没有收到回复,那么就为断开状态.思路就是这个,socket下的都一样.

socket断开的时候程序能触发一个事件的 答案补充 我知道 不是单个SOCKET连接么判断断开其实就是客户端下线的操作我一直用的完成端口.可能与你的不同但这个操作肯定会判断到 答案补充 你把你的源码贴出来吧 答案补充 这个样啊断电的时候客户端没来得及向SOCKET发出指令,看来你需要开一线程来判断了,具体判断你根据实际情况或者用TCP的堆栈中ping命令来检测

法一:当recv()返回值小于等于0时,socket连接断开.但是还需要判断 errno是否等于 EINTR,如果errno == EINTR 则说明recv函数是由于程序接收到信号后返回的,socket连接还是正常的,不应close掉socket连接.法二: struct tcp_info info;

socket通道一但建立,就始终保持.非正常close会引发异常.捕获异常即可以.

Socket正常断开要经过四次信息交互非正常断开,可以设置心跳机制 来判断断开如每秒客户端向服务器发一个心跳包如果服务器3秒内都没收到心跳包可视为客户端断开了

通过心跳包来确保客户端是否正常连接,比如定时发心跳包给客户端,然后接收回应包,如果没有收到该回应包则可以认为客户端已经断开连接,这个算是常规做法,至少在我所有SOCKET编程中都使用这种方式来维护连接状态.

这个要分情况了.如果是UDP的话,就不存在连接不连接的问题了.因为这个是面向无连接的,直接发送数据即可.如果是TCP的话,就需要连接了.你应该这么办:首先每隔一段时间查看是否与服务器断开了,或者根据你具体的要求来查看是否断开.第二重新连接.你想问的事如何重新连接是把?你之前的连接就是发送了客户端是发送了connet函数连接把?如果发现断线了,就重新发送connect函数连接即可.

一: 如果客户端关闭连接,服务器端会收到一条连接关闭的消息,对应到你的C函数API就是,使用recv(或者read),读出的大小为0,此时就表明客户端断开连接了,如果是TCP的话,你也调用一次close(或者shutdown),这样就可以把一个TCP连接完美优雅的断开.二: 服务器编程肯定会在accept新连接之后,保存在一个数据结构中的.发送同样的内容,只需要遍历此数据结构即可.

相关搜索:

网站地图

All rights reserved Powered by www.3112.net

copyright ©right 2010-2021。
www.3112.net内容来自网络,如有侵犯请联系客服。zhit325@qq.com