By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
439,985 Members | 1,574 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 439,985 IT Pros & Developers. It's quick & easy.

Detecting shutdown of remote socket endpoint.

P: n/a
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([],[s],[], 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?
Jul 18 '05 #1
Share this Question
Share on Google+
1 Reply


P: n/a
Tim Gosselin <go******@norwich.edu> 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
Jul 18 '05 #2

This discussion thread is closed

Replies have been disabled for this discussion.