服务器如何知道客户端异常断开连接?

心跳:

在服务器端可以采用SetSockOpt来设置keepalive属性,同时修改注册表,这样出现客户端异常退出的时候,服务器端就能够知道,并且上报应用层

 

time_wait状态与FIN状态

首先启动socket服务端,然后用客户端进行连接,用netstat –ant命令查看目前套接字的状态:

keepalived如何检查ip是否正常_客户端

发现客户端和服务器的套接字都进入了established状态,说明客户端和服务端都正常工作,此时我们在服务端输入Ctrl+C终端服务端程序,再次输入netstat–ant命令,这是就看到了服务端进入了FIN_WAIT2状态,而客户端进入了CLOSE_WAIT状态。

keepalived如何检查ip是否正常_客户端_02

 关于断开套接字断开连接时的四次握手在这里不再赘述,而这个FIN_WAIT2状态就是服务端在主动发起断开的连接请求时,发送FIN并收到客户端的ACK进入的等待客户端FIN的状态;而与FIN_WAIT2相对的FIN_WAIT1就是服务端发送完成FIN后还未接收到客户端返回的ACK时进入的状态,这个状态时长很短,在我本机上无法捕捉;这个CLOSE_WAIT状态是客户端接受到服务端的FIN并发送ACK后,等待用户手动关闭套接字的状态。

   此时如果关闭客户端的套接字,直接在客户端输入Ctrl+C,服务端就会进入我们熟悉的TIME_WAIT状态:

keepalived如何检查ip是否正常_套接字_03

 

参考:

服务器如何知道客户端异常断开连接

TIME_WAIT、FIN_WAIT1、FIN_WAIT2和CLOSE_WAIT状态的区别

tcp连接状态分析

https://wenku.baidu.com/view/dae0af8814791711cd791795.html

http://zheming.wang/blog/2013/08/18/4417B74D-F037-414A-A291-CEF7B3CD511D/

服务器TIME_WAIT和CLOSE_WAIT详解和解决办法

你所不知道的TIME_WAIT和CLOSE_WAIT

 

Linux下通过进程名查询占用的端口

1、首先根据名称用ps命令查看进程ID:

 



ps -ef | grep zookeeper



2、查到进程ID之后,使用netstat命令查看其占用的端口:

 

netstat -anp | grep 10997    

windows
netstat -aon|findstr "49157"

 

3、查找进程运行的完整路径

 

通过pstop命令查看进程信息时,只能查到相对路径,查不到的进程的详细信息,如绝对路径等。这时,我们需要通过以下的方法来查看进程的详细信息:

Linux在启动一个进程时,系统会在/proc下创建一个以PID命名的文件夹,在该文件夹下会有我们的进程的信息,其中包括一个名为exe的文件即记录了绝对路径,通过llls –l命令即可查看。

ll /proc/PID

cwd符号链接的是进程运行目录;

exe符号连接就是执行程序的绝对路径;

cmdline就是程序运行时输入的命令行命令;

environ记录了进程运行时的环境变量;

fd目录下是进程打开或使用的文件的符号连接。