This is the mail archive of the java@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Socket's close() doesn't close connection (old bug?)


Hi,

In my eager to reproduce another bug I've stumbled across yet another strange issue - namely that Socket's close() doesn't close underlying socket (with no traffic), nor "wake up" a blocked read-thread (as a consequence)...
Blah blah blah, this turned out to be reported already:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15430

Unfortunately still open ;-)

// Martin

That is, I create server-socket on my server (!), wait for a client to connect. When the client is connected, I start a new thread waiting for two seconds before trying to close the socket. Meanwhile, I make the main-thread get caught in the socket's inputstream's read().

For a client I just use telnet to the given port 123, and do nothing.
On Sun's VM (on i386) it does as expected, but with GCJ (on PPC) the read() is stuck until I try sendind data - e.g. pressing enter...


After calling close(), "netstat" still reports the connection as "Established".

However, this may be an old bug, since I'm still stuck with an old 3.4.3. But but but, I've tried fetching natPlainSocketImplPosix.cc and PlainSocketImpl.java from CVS and that's the same result.
Maybe it's even related to my kernel?!



I'm suspecting it may be related to the discussion in: http://gcc.gnu.org/ml/java/2004-09/msg00152.html

Moreover, in the same thread, David Daney claims that:

Reads are usless for detecting connections that have not terminated
"normally". Doing a write is the only reliable method for determining that a connection is still "open".


However, I reckon this is a matter of "normal" termination, right!?

BR,
 Martin Egholm

============ Server4.java ============

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server4 extends Thread
{
  public static void main(String[] args) throws IOException
  {
    ServerSocket ss = new ServerSocket(123);

final Socket s = ss.accept();

    Thread closerThread = new Thread()
    {
      public void run()
      {
        System.out.println("Sleeping before closing...");
        try
        {
          Thread.sleep(2000);
        } // try
        catch (InterruptedException e)
        {
          e.printStackTrace();
        } // catch

System.out.println("Done sleeping! Closing... " + s.getClass());

        try
        {
          s.close();
        } // try
        catch (IOException e)
        {
          e.printStackTrace();
        } // catch

        System.out.println("Done closing!");
      } // run
    }; // closerThread
    closerThread.start();

    try
    {
      InputStream is = s.getInputStream();
      System.out.println("Reading...");
      is.read();
      System.out.println("Done reading!");
    } // try
    catch (IOException e)
    {
      System.out.println("An exception!");

      e.printStackTrace();
    } // catch
    System.out.println("And out of reader!");
  } // main
} // Server4




Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]