13-TCP 协议(FIN_WAIT2)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q1007729991/article/details/69696055

转载请注明出处http://blog.csdn.net/q1007729991/article/details/69696055

1. FIN_WAIT2 状态

如果你完成了上一篇文章的实验,你肯定见过了 FIN_WAIT2 状态。

当主动关闭一方进入 FIN_WAIT2 状态时,只要对端还没有发送 FIN 段过来(处于 CLOSE_WAIT 状态,等等再关闭,我还有数据要发送),就会一直停留在这个状态。因此,FIN_WAIT2 状态会非常容易见到。


这里写图片描述
图1 处于 FIN_WAIT2 状态

很不幸,主动关闭一方有可能永远处于 FIN_WAIT2 状态,只要对方不发送 FIN 段的话(比如对端在 CLOSE_WAIT 状态时突然断电、网线掉了)。

在有些系统实现中,为了防止这种无限 FIN_WAIT2,设置了一个定时器。如果这个连接空闲 10 分钟 75 秒,TCP 将进入 CLOSED 状态。实际上,这是违反协议的,但又未尝不可呢?

2. 总结

  • 知道如何进入 FIN_WAIT2 状态
  • 知道有些系统是如何处理长期处于 FIN_WAIT2 状态的。
阅读更多
换一批

java.net.socket中 close_wait fin_wait2 问题

07-29

/******************************************************/rn******************** listenserve.java ************************************rnimport java.io.*;rnimport java.lang.*;rnimport java.net.ServerSocket;rnimport java.net.Socket;rnimport javax.net.ServerSocketFactory;rnimport javax.net.SocketFactory;rnrnrnrn// 主程序一直处于监听状态,有连接则启动一个线程进行处理,以实现多个客户端rnrnpublic class listenserve rn private ServerSocket ss;rn private boolean listening = true;rn public listenserve() rn Init(); // 初始化rn lisn(); // 启动监听 rn rnrn public void Init() rn try rn ss = new ServerSocket(10015, 10);rn catch (IOException ie) rn System.out.println("无法在10015端口监听");rn ie.printStackTrace();rn rn rnrn public void lisn() rn try rn while (listening) rn new Thread(new dialogserve(ss.accept())).start();rn rn catch (IOException ie) rn ie.printStackTrace();rn rn rnrn public static void main(String args[]) rn new listenserve();rn rnrn/******************************************************/rn******************** dialogserve.java ************************************rnimport java.io.*;rnimport java.lang.*;rnimport java.net.ServerSocket;rnimport java.net.Socket;rnimport java.net.SocketException;rnrnrnpublic class dialogserve implements Runnable rn private Socket s;rn private InputStream in;rn private String rev, temp;rn private byte b[];rn private int len;rn public dialogserve(Socket ss) rn s = ss;rn b = new byte[1024];rn try rn in = s.getInputStream();rn catch (IOException ie) rn ie.printStackTrace();rn rn rev = "";rn rnrn public void run() rn try rn while (s.isConnected() == true) rn if ((len = in.read(b)) != -1) rn temp = new String(b, 0, len);rn rev += temp;rn System.out.println(rev);rn temp = null;rn //Thread.sleep(1000);rn rn rn in.close();rn System.out.println("会话socket已断开!");rn s.close();rn rn catch (SocketException se) rn System.out.println("客户端已断开!");rn System.exit(0);rn catch (IOException io) rn io.printStackTrace();rn System.exit(0);rn rn /*rn catch (InterruptedException ire) rn ire.printStackTrace();rn rn */rn rnrn/**********************************************************/rn******************** TcpClient.java ************************************rnrnrnimport java.net.*;rnimport java.io.*;rnrnpublic class TcpClient implements Runnablernrn private Socket socket;rn private OutputStream out;rn private String send;rn rn public void run()rn rn tryrn rn socket = new Socket();rn //socket.setSoTimeout(10000);rn socket.connect(new InetSocketAddress("localhost", 10015),10000); rn out = socket.getOutputStream();rn send = Thread.currentThread().getName();rnrn out.write(send.getBytes());rn out.flush();rn out.close();rn socket.close();rn rn catch (Exception e)rn rn e.printStackTrace();rn rn rn rn public static void main(String[] args)rn rn for (int i=0; i< 10 ; i++ )rn rn (new Thread(new TcpClient())).start();rn rn rnrn/************************************************************************************/rnrn问题,TcpClient 运行完后,发现程序中所用的 10个连接并没有并关闭,rn服务器端的 处于 close_wait状态 , 客户端的处于 fin_wait 2 状态。rnrn请教: 如何保证 TCP连接的关闭?rn

没有更多推荐了,返回首页