TCP客户端判断与服务端断开连接的几种方法

这篇具有很好参考价值的文章主要介绍了TCP客户端判断与服务端断开连接的几种方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目前已知的方法有:
1、epoll(能检测正常的断开连接,事件触发机制,优点是快速,但是插拔网线是检测不到的)
2、自定义心跳包方式检测
3、keeplive方式检测
4、getsockopt

1、epoll

1、相对于select和poll来说,epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。
2、在注册epoll的时候主要是监听两类事件(EPOLLIN和EPOLLOUT),这两类事件分别代表着可读和可写。我们可以创建读写回调函数,当检测到对应事件的时候,调用对应的程序。为了检测客户端和服务器已经断开我们需要注册另一类事件(EPOLLRDHUP)。该事件代表的是读关闭,当服务器close的时候,会触发该事件。(注意不能读的意思内核不能再往内核缓冲区中增加新的内容。已经在内核缓冲区中的内容,用户态依然能够读取到。)

2、自定义心跳包方式检测

该方式对于大家都不陌生,说的直白一点就是定时发送心跳包给服务器。如果发送失败或者服务器没有定时回复,则认为连接已经断开。该方式通用、常见并且有效。在一些实时性要求不高的地方推荐这种方式。(基本现在的cs架构都有心跳机制)。但是该方式不适合我上述需求,因为心跳包是有间隔的,有间隔就代表有延时。同时又不能把心跳包设置的太短,这样会增加服务器负荷。

3、keeplive方式检测

利用系统发送心跳包。和上述心跳包检测方式一致
设置三个参数:

  1. tcp_keepalive_time:连接闲置多久开始发keepalive的ack包
  2. tcp_keepalive_probes:发几个ack包不回复才当对方死了
  3. tcp_keepalive_intvl:两个ack包之间间隔多长

4、getsockopt

在应用程序中可以通过调用如下代码来判断连接是否断开文章来源地址https://www.toymoban.com/news/detail-413351.html

	getsockopt(g_fd, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&len);
	if ((info.tcpi_state == TCP_ESTABLISHED)) //检测通信是否还处于建立连接的状态
	{
    	// myprintf("socket connected\n");
    	return 1;
	}
	else
	{
    	printf("===========socket disconnected");
    	// myprintf("socket disconnected\n");
    	return 0;
    }

到了这里,关于TCP客户端判断与服务端断开连接的几种方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FRP 进行内网穿透,在一台客户端上配置多台服务器连接,winsw 配置多个 windows 自启动服务,Windows 远程桌面连接时目标客户端断开 WIFI连接解决办法

    本篇博客建立在已经使用 FRP 实现通过一台服务器范围一台客户端的基础上,不会从头开始对如何配置 FRP 实现内网穿透进行介绍。有需要这方面的同学可以参考下面这篇文章:【计算机网络相关】内网穿透介绍以及使用FRP实现内网穿透Windows远程桌面_frp内网穿透-CSDN博客 本篇

    2024年02月01日
    浏览(50)
  • QT实现客户端断开连接

    Widget.cpp Widget.h main.cpp

    2024年04月14日
    浏览(45)
  • tcp服务器端与多个客户端连接

    如果希望Tcp服务器端可以与多个客户端连接,可以这样写: 相关的槽函数中: 使用sender()来获取对应的QTcpSocket对象。 其实,主要就是QTcpServer进行监听: 客户端的QTcpSocket与服务器端的QTcpSocket进行通信。

    2024年04月28日
    浏览(28)
  • netty-发起tcp长连接(包含客户端和服务端)

    Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持。 Netty是对JDK自带的NIO的API进行封装,具有高并发,高性能等优点。 项目中经常用到netty实现服务器与设备的通信,先写服务端代码: 服务端处理类代码: 接下来 模拟 客户端: 客户端处理类代

    2024年02月12日
    浏览(33)
  • TCP服务器最多支持多少客户端连接

    目录 一、理论数值 二、实际部署  参考         首先知道一个基础概念,对于一个 TCP 连接可以使用四元组(src_ip, src_port, dst_ip, dst_port)进行唯一标识。因为服务端 IP 和 Port 是固定的(如下图中的bind阶段),那么一个TCP服务器支持最多的连接数就是由客户端 IP 和 端口

    2024年01月21日
    浏览(39)
  • Golang实现之TCP长连接-------服务端和客户端

    一、数据包的数据结构 (所有字段采用大端序) 帧头 帧长度(头至尾) 帧类型 帧数据 帧尾 1字节 4字节 2字节 1024字节 1字节 byte int short string byte 0xC8 0xC9 二、Server端 实现代码 1、main.go 2、server.go 3、protocol.go 4、response.go 5、result.go 三、Client端 实现代码

    2024年02月07日
    浏览(39)
  • Python启动TCP服务并监听连接,从客户端发送消息

    下面是一个简单的例子,演示如何在Python中启动TCP服务并监听连接,以及如何从客户端发送消息: TCP服务端代码: TCP客户端代码: 这个例子中,服务端首先创建一个socket对象并绑定地址和端口,然后开始监听连接。当客户端连接到服务器时,服务端接受客户端的连接请求并

    2024年02月13日
    浏览(31)
  • python实现TCP数据通讯,socket 客户端断开依然保持监听,多线程。

    服务端: 客户端: 服务端采用 try...except .. 形式,代码如下:

    2024年02月14日
    浏览(31)
  • Socket实例,实现多个客户端连接同一个服务端代码&TCP网络编程 ServerSocket和Socket实现多客户端聊天

    Java socket(套接字)通常也称作\\\"套接字\\\",用于描述ip地址和端口,是一个通信链的句柄。应用程序通常通过\\\"套接字\\\"向网络发出请求或者应答网络请求。 使用socket实现多个客户端和同一客户端通讯;首先客户端连接服务端发送一条消息,服务端接收到消息后进行处理,完成后再

    2024年02月12日
    浏览(49)
  • QT-TCP客户端发现服务端掉线后如何自动重连接?

    在QT中,可以通过QTcpSocket类实现TCP客户端的网络连接,如果客户端断连后需要实现重连,可以在QTcpSocket的disconnected()信号处理槽中执行重连操作。具体实现步骤如下: 定义QTcpSocket实例变量,在构造函数中初始化并连接相应的信号和槽函数。 构造函数中初始化和连接相应的信

    2024年02月15日
    浏览(110)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包