服务器如何知道客户端异常断开连接?
心跳:
在服务器端可以采用SetSockOpt来设置keepalive属性,同时修改注册表,这样出现客户端异常退出的时候,服务器端就能够知道,并且上报应用层
time_wait状态与FIN状态
首先启动socket服务端,然后用客户端进行连接,用netstat –ant命令查看目前套接字的状态:
发现客户端和服务器的套接字都进入了established状态,说明客户端和服务端都正常工作,此时我们在服务端输入Ctrl+C终端服务端程序,再次输入netstat–ant命令,这是就看到了服务端进入了FIN_WAIT2状态,而客户端进入了CLOSE_WAIT状态。
关于断开套接字断开连接时的四次握手在这里不再赘述,而这个FIN_WAIT2状态就是服务端在主动发起断开的连接请求时,发送FIN并收到客户端的ACK进入的等待客户端FIN的状态;而与FIN_WAIT2相对的FIN_WAIT1就是服务端发送完成FIN后还未接收到客户端返回的ACK时进入的状态,这个状态时长很短,在我本机上无法捕捉;这个CLOSE_WAIT状态是客户端接受到服务端的FIN并发送ACK后,等待用户手动关闭套接字的状态。
此时如果关闭客户端的套接字,直接在客户端输入Ctrl+C,服务端就会进入我们熟悉的TIME_WAIT状态:
参考:
TIME_WAIT、FIN_WAIT1、FIN_WAIT2和CLOSE_WAIT状态的区别
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、查找进程运行的完整路径
通过ps及top命令查看进程信息时,只能查到相对路径,查不到的进程的详细信息,如绝对路径等。这时,我们需要通过以下的方法来查看进程的详细信息:
Linux在启动一个进程时,系统会在/proc下创建一个以PID命名的文件夹,在该文件夹下会有我们的进程的信息,其中包括一个名为exe的文件即记录了绝对路径,通过ll或ls –l命令即可查看。
cwd符号链接的是进程运行目录;
exe符号连接就是执行程序的绝对路径;
cmdline就是程序运行时输入的命令行命令;
environ记录了进程运行时的环境变量;
fd目录下是进程打开或使用的文件的符号连接。