Domanda

I'm trying one scenario where my local ip is pinging ,server1_ip and server2_ip, but it's causing hogging on server as there are more than 1 connections on same ip's port as below..

[root@local ~]# netstat -antup -p|grep 8000
tcp        1      1 ::ffff:local_ip:58972 ::ffff:server1_ip:8000  LAST_ACK    -
tcp        1      1 ::ffff:local_ip:49169 ::ffff:server2_ip:8000  LAST_ACK    -
tcp        1      0 ::ffff:local_ip:49172 ::ffff:server2_ip:8000  CLOSE_WAIT  25544/java
tcp        1      0 ::ffff:local_ip:58982 ::ffff:server1_ip:8000  CLOSE_WAIT  25544/java
tcp        1      1 ::ffff:local_ip:58975 ::ffff:server1_ip:8000  LAST_ACK    -
tcp        1      1 ::ffff:local_ip:49162 ::ffff:server2_ip:8000  LAST_ACK    -

there are 2 threads , on some functionality I need to stop thread and also close socket connection on port 8000. which is I'm doing with following method which is part of my thread.

protected void disconnect() {
    if (this.mSocket != null) {
        try {
            this.mSocket.shutdownInput();
            this.mSocket.shutdownOutput();
            this.mOutputStream.flush();
            this.mOutputStream.close();
            this.mInputStream.close();
            this.mSocket.close();

        } catch (Exception vException) {
            vException.printStackTrace();               
        }           
    }

    this.mInputStream = null;
    this.mOutputStream = null;
    this.mSocket = null;    
}

but when this method is called it's sending that connection in LAST_ACK state. Please let me know cause of this and solution on this problem.

È stato utile?

Soluzione

CLOSE_WAIT and LAST_ACK are intermediary states of a TCP connection reached just before closing. The tcp connection should eventually reache the CLOSED state: CLOSE_WAIT->LAST_ACK->CLOSED. So there is normal what are you seeing in netstat.

See this diagram of a tcp connection transition state: http://www.cs.northwestern.edu/~agupta/cs340/project2/TCPIP_State_Transition_Diagram.pdf

The only issue in your code is that you call flush on the OutputStream after shutting down output. You can remove the shutdownInput & shutdownOutput, they are useful when you want to close a single communication way: input or output.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top