From: cliff wu Date: 2006-05-16T13:06:19+09:00 Subject: A bug? Socket broken due to resource leak in failed connect? It is really a triky problem. Following code is used to illustrate the problem I encountered. Before you execute it, please ensure to be offline, so it can be run very fast. Please notice the line in tcpclient.rb "145.times do", it is the key issue. Let me explain it. Tcpserver.rb is a local tcp server simply sends a hello message whenever a client connects and sends a request. Tcpclient.rb first makes a connect to the local tcp server, then tries many times to connect to a bad ip addresses which indeed can never be connected. So every try will raise a exception " Unknown Error - connect(2)". This exception is simply ignored and the client continues trying. The wierd thing is , after certain number of tries, the established connection between the tcp client and the local tcp server is broken. So the line "from tcpclient.rb:19:in goodConn.puts" also raises a exception . Even more, what exception "goodConn.puts" raised is realted to the number of tries to connect to the bad ip. a. if times is less than 140 , it acts normally, nothing wrong, a hello message is received from the local tcp server. I got this: Exception raised: Unknown Error - connect(2) Hello from local tcp server b. If 140< times <145, I got this : Exception raised: Unknown Error - connect(2) tcpclient.rb:19:in `write': Bad file descriptor (Errno::EBADF) from tcpclient.rb:19:in `puts' from tcpclient.rb:19:in `testsocket' from tcpclient.rb:25 c. if times > 145, I got this: Exception raised: Unknown Error - connect(2) tcpclient.rb:19:in `write': Invalid argument (Errno::EINVAL) from tcpclient.rb:19:in `puts' from tcpclient.rb:19:in `testsocket' from tcpclient.rb:25 General speaking, it seems a resource leak happens every time a "Unknown Error-connect(2)" exception raised when the tcpclient failed to connnect to a bad ip address. So after substantial times of tries, the leak accumulates and the socket is crushed. Is it a bug of socket library?? Code is listed below, if you are insterested, please try it, run the ftpserver.rb first, the run the tcpclient in another console. Be sure to be offline when you try the code. Being offline will make it run fast, otherwise it will take long time to run tcpserver.rb: require 'socket' server = TCPServer.new('localhost',21) while(session = server.accept) puts "Client Request: #{session.gets}" session.print "Hello from local tcp server" session.close end tcpclient.rb: require 'socket' def testsocket goodAddr = "localhost" goodConn = TCPSocket.new(goodAddr,21) badAddr = "137.144.70.12" #no connection could established on this address 145.times do badconn = nil begin badconn = TCPSocket.new(badAddr,21) rescue Exception => aException puts "Exception raised: #{aException.to_s}" ensure badconn.close if @badconn and not @badconn.closed? end end goodConn.puts("hello") s = goodConn.gets puts s goodConn.close end testsocket My OS is windows 98, ruby version is ruby 1.8.2 (2004-12-25) [i386-mswin32]. -- Posted via http://www.ruby-forum.com/.