socket连接如何检查用户断线
1个回答
展开全部
判断socket是否已经断开的方法是使用非阻塞的select方式进行socket检查,步骤如下:
1)设置接收到的socket为异步方式;
2)使用select()函数测试一个socket是否可读;
3)如果select()函数返回的值为1,但是使用recv()函数读取的数据长度为0,那么说明该socket已经断开。
如果recv()返回值小于等于0时,客户端的连接已经断开,但是还需要判断errno是否等于EINTR。如果errno=EINTR则说明recv()函数是由于程序接收到中断信号后返回的,socket连接应该还是正常,步应该close掉socket连接。
注:对于阻塞socket的recv函数会在以下三种情况下返回值:
1)接收到数据时会返回;
2)程序接收到信号时返回-1,errno=EINTR;
3)Socket出现问题时,返回-1,具体的错误码请查看man recv;
4)一定要养成查看man说明,内容很详细,很有帮助。
这种方法经过长时间的测试证明是有效的,仅供大家参考。
此外,UNP卷一上有很多socket异常情况下的模拟解释,大家可以去阅读下。如果网络中间有多级路由,路由当掉等很多情况出现,所以建议程序中在应用层中加入心跳(heartbeat机制)和重连来维持连接的状态。
TCP protocol has a timer to determine if the connection is abnormally closed. But this timeout value is very long by default and if you want to check this situation as soon as possible to improve performance, the best solution is to introduce a keepalive mechanism in application protocol design.
TCP协议有一个定时器来决定连接是否被异常关闭。但是该超时时间值缺省的情况下会非常长,如果你希望尽快的检查出这种状态改进性能,最好的方法就是在应用程序协议设计的时候引入keepalive(保持连接)机制
1)设置接收到的socket为异步方式;
2)使用select()函数测试一个socket是否可读;
3)如果select()函数返回的值为1,但是使用recv()函数读取的数据长度为0,那么说明该socket已经断开。
如果recv()返回值小于等于0时,客户端的连接已经断开,但是还需要判断errno是否等于EINTR。如果errno=EINTR则说明recv()函数是由于程序接收到中断信号后返回的,socket连接应该还是正常,步应该close掉socket连接。
注:对于阻塞socket的recv函数会在以下三种情况下返回值:
1)接收到数据时会返回;
2)程序接收到信号时返回-1,errno=EINTR;
3)Socket出现问题时,返回-1,具体的错误码请查看man recv;
4)一定要养成查看man说明,内容很详细,很有帮助。
这种方法经过长时间的测试证明是有效的,仅供大家参考。
此外,UNP卷一上有很多socket异常情况下的模拟解释,大家可以去阅读下。如果网络中间有多级路由,路由当掉等很多情况出现,所以建议程序中在应用层中加入心跳(heartbeat机制)和重连来维持连接的状态。
TCP protocol has a timer to determine if the connection is abnormally closed. But this timeout value is very long by default and if you want to check this situation as soon as possible to improve performance, the best solution is to introduce a keepalive mechanism in application protocol design.
TCP协议有一个定时器来决定连接是否被异常关闭。但是该超时时间值缺省的情况下会非常长,如果你希望尽快的检查出这种状态改进性能,最好的方法就是在应用程序协议设计的时候引入keepalive(保持连接)机制
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询