Detecting shutdown of remote socket endpoint.

Discussion in 'Python' started by Tim Gosselin, Jan 11, 2005.

  1. Tim Gosselin

    Tim Gosselin Guest

    I am writing a tcp tunnel but cannot find a way of detecting when a socket
    shuts down its read end without writing to the socket. For testing the
    write end of the remote endpoint I just do a:

    if not sock.recv(buffsize)

    I cannot write to the socket and check if send returns 0 though, because
    that involves sending data out of the which may not have come in yet.

    When I try polling the socket with:
    r, w, e=select([],[sock],[], 0)
    w returns with the socket still writable, even if the other end was
    closed.

    #For example:
    s=socket()
    s.bind(('localhost', 5000))
    s.listen(5)
    s2, addr=s.accept()

    #then create a socket to connect,
    s=socket()
    s.connect(('localhost', 5000))

    #then I close the server side,
    s2.close() #or s2.shutdown(0)

    #and poll s to see if it's still writable,
    r, w, e=select([],,[], 0)
    #this returns that the socket is writable! and i can even write to it,
    s.send('test') #succeeds
    #but the second write finally throws an exception.

    Is there any other way to check if a the remote endpoint on a socket has
    shutdown its read end? Is it difficult to implement a sock.is_shutdown(1)
    with some additional c code?
    Tim Gosselin, Jan 11, 2005
    #1
    1. Advertising

  2. Tim Gosselin <> wrote:
    > I am writing a tcp tunnel but cannot find a way of detecting when a socket
    > shuts down its read end without writing to the socket. For testing the
    > write end of the remote endpoint I just do a:
    >
    > if not sock.recv(buffsize)
    >
    > I cannot write to the socket and check if send returns 0 though, because
    > that involves sending data out of the which may not have come in yet.
    >
    > When I try polling the socket with:
    > r, w, e=select([],[sock],[], 0)
    > w returns with the socket still writable, even if the other end was
    > closed.


    Even at the C level, I believe there were some differences between
    Unix and Windows sockets in regard to this, so this advice may be
    dependent on your platform.

    At any rate, on both Unix and Windows, a closed socket will continue
    to report itself as writable. To detect the closed socket, I believe
    that one system reports the socket as being in error whereas the
    other system reports the socket as being readable (where read() will
    then immediately return 0 because the socket is closed).

    So in summary, instead of:
    r, w, e=select([],[sock],[], 0)
    try this:
    r, w, e=select([sock],[],[sock], 0)
    If r or e is non-empty, then the socket has been closed (or there's
    some other error).

    HTH,
    - Mike
    Michael Hobbs, Jan 12, 2005
    #2
    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. Jason Teagle
    Replies:
    12
    Views:
    3,135
    Jason Teagle
    Oct 5, 2003
  2. Rich
    Replies:
    5
    Views:
    2,431
    Bruce the Shark
    Sep 17, 2004
  3. Replies:
    1
    Views:
    1,723
    Dennis Lee Bieber
    Jan 18, 2007
  4. Replies:
    3
    Views:
    924
  5. Dennis Misener

    Detecting Windows Shutdown

    Dennis Misener, Jun 29, 2005, in forum: Ruby
    Replies:
    0
    Views:
    88
    Dennis Misener
    Jun 29, 2005
Loading...

Share This Page