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

Martin Egholm Nielsen martin@egholm-nielsen.dk
Tue Nov 8 15:18:00 GMT 2005


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
>>


More information about the Java mailing list

AltStyle によって変換されたページ (->オリジナル) /