如何检测TCP保持活动数据包并保持连接打开

如何检测TCP保持活动数据包并保持连接打开,c,tcp,epoll,tcp-keepalive,C,Tcp,Epoll,Tcp Keepalive,我用epoll编写了自己的服务器。当我将TCP保持活动包从客户端发送到服务器时,将不会触发epoll事件。问题:当服务器获取tcp保持活动包时,我希望我的服务器保持连接打开 我还尝试查看tcp信息,但当服务器获得保持活动的包时,其属性并没有更新 我知道tcp保持活动包不是数据而是头。我在tcpdump中看到,内核在收到keep-alive包后返回了tcp-keep-alive-ACK。我的目标是在keep alive到达时保持连接打开(类似于我的服务器中的重置计时器,我的服务器可以在没有tcp真

我用epoll编写了自己的服务器。当我将TCP保持活动包从客户端发送到服务器时,将不会触发epoll事件。问题:当服务器获取tcp保持活动包时,我希望我的服务器保持连接打开

我还尝试查看tcp信息,但当服务器获得保持活动的包时,其属性并没有更新

我知道tcp保持活动包不是数据而是头。我在tcpdump中看到,内核在收到keep-alive包后返回了tcp-keep-alive-ACK。我的目标是在keep alive到达时保持连接打开(类似于我的服务器中的重置计时器,我的服务器可以在没有tcp真实数据的情况下关闭连接)

我将客户端设置为建立连接并发送数据(例如“hello world”),然后将保持活动的包发送到服务器

我的服务器已触发epoll。我还尝试将服务器设置为非阻塞

//我测试了epoll设置
EPOLLIN | Epollot | EpollDup | EPOLLET

(我在互联网上发现的大多数问题都与客户端有关,我的问题更多的是关于tcp保持活动的服务器或接收器端,如何保持它的开放性)

不,据我所知,这是不可能的


您必须在应用程序协议中实现心跳信号,然后才能停止使用TCP keepalive。

TCP keepalive是空数据包,应用程序看不到它们。为什么您认为需要做任何事情来保持连接打开?请注意,“keepalive”这个名字有误导性。它不能使连接保持活动状态,它会检测连接何时在没有正常关闭的情况下消失。您遇到了什么问题?只要客户端和服务器都不调用
close()
,连接就会自动保持打开状态。你不能发现keepalives,但你不需要。我想要一匹小马。我们俩都得不到我们想要的。