Socket broken due to socket resource leak???

Discussion in 'Ruby' started by uncutstone, May 15, 2006.

  1. uncutstone

    uncutstone Guest

    It is really a triky problem. My OS is windows 98, ruby version is ruby
    1.8.2 (2004-12-25) [i386-mswin32].

    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 is connected. Tcpclient.rb first makes a connect to
    the local tcp server( this connection will be read later), 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 wiered thing is , after certain number of tries, the established
    connection between the tcp client and the local tcp server is broken.
    So the line "goodConn.gets" also raises a exception . Even more,
    what exception "goodConn.gets" 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 `gets': Bad file descriptor (Errno::EBADF)
    from tcpclient.rb:19:in `testsocket'
    from tcpclient.rb:24

    c. if times > 145, I got this:
    Exception raised: Unknown Error - connect(2)
    tcpclient.rb:19:in `gets': Invalid argument (Errno::EINVAL)
    from tcpclient.rb:19:in `testsocket'
    from tcpclient.rb:24

    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 a substantial number
    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.
    1. tcpserver.rb:

    require 'socket'
    server = TCPServer.new('localhost',21)
    while(session = server.accept)
    session.print "Hello from local tcp server"
    session.close
    end


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

    s = goodConn.gets
    puts s
    goodConn.close
    end

    testsocket
    uncutstone, May 15, 2006
    #1
    1. Advertising

  2. uncutstone wrote:
    > It is really a triky problem. My OS is windows 98, ruby version is ruby
    > 1.8.2 (2004-12-25) [i386-mswin32].
    >
    > 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 is connected. Tcpclient.rb first makes a connect to
    > the local tcp server( this connection will be read later), 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 wiered thing is , after certain number of tries, the established
    > connection between the tcp client and the local tcp server is broken.
    > So the line "goodConn.gets" also raises a exception . Even more,
    > what exception "goodConn.gets" raised is realted to the number of
    > tries to connect to the bad ip.


    This comes as no surprise as the server closes the connection after it
    has sent his hello message. Since you don't immediately retrieve the
    message it may well be that the connection close overrides the buffered
    data and you never see it.

    Kind regards

    robert
    Robert Klemme, May 15, 2006
    #2
    1. Advertising

  3. uncutstone

    uncutstone Guest

    Robert Klemme wrote:
    > This comes as no surprise as the server closes the connection after it
    > has sent his hello message. Since you don't immediately retrieve the
    > message it may well be that the connection close overrides the buffered
    > data and you never see it.


    It is not so simple. Please try anotherclient.rb
    require 'socket'

    def testsocket
    goodAddr = "localhost"
    goodConn = TCPSocket.new(goodAddr,21)

    sleep 30

    s = goodConn.gets
    puts s
    goodConn.close
    end

    testsocket
    I got:
    Hello from local tcp server

    After 30 seconds of sleep, tcp server is sure has closed the session,
    client can still get the result .

    You can also add a line "session.gets" in tcpserver.rb before
    “session.print ‘Hello from local tcp server’”
    and a goodConn.puts("hello") before "goodConn.gets", so the tcpserver
    will wait for tcpclient before it sends hello message.
    But what I have described remains , socket broken due to substantial
    times of failed connection attempt.
    uncutstone, May 15, 2006
    #3
  4. uncutstone

    uncutstone Guest

    I rewrite the code, socket broken still happens:

    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
    160.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
    uncutstone, May 15, 2006
    #4
  5. uncutstone

    uncutstone Guest

    Be sure to be offline when you try the code above. Being offline will
    make it run fast, otherwise it will take long time to run.
    uncutstone, May 15, 2006
    #5
  6. uncutstone

    uncutstone Guest

    Maybe this post is too long to read. Let me make it simple.

    General speaking, I think it is likely a bug of ruby's socket library.
    It seems that a resource leak happens every time TCPSocket.new failed.

    Do you agree it is a bug? Or I missunderstood something. Any opinion is
    highly appreciated.
    uncutstone, May 16, 2006
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Memory leak due to onCtlColor ?

    , Apr 13, 2006, in forum: C Programming
    Replies:
    1
    Views:
    350
    Vladimir S. Oka
    Apr 13, 2006
  2. Fresh
    Replies:
    2
    Views:
    633
    Bo Persson
    Apr 22, 2008
  3. bernd
    Replies:
    10
    Views:
    2,237
    Gordon Beaton
    Aug 6, 2008
  4. Steven D'Aprano

    Why are "broken iterators" broken?

    Steven D'Aprano, Sep 21, 2008, in forum: Python
    Replies:
    8
    Views:
    646
  5. Cameron Simpson

    Re: Why are "broken iterators" broken?

    Cameron Simpson, Sep 22, 2008, in forum: Python
    Replies:
    0
    Views:
    583
    Cameron Simpson
    Sep 22, 2008
Loading...

Share This Page