I'm using this method to read from a socket:

   def read_data(self,size):
       """Read data from connection until a given size."""
       res = ""
       fd = self.socket.fileno()
       while not self.stop_requested.isSet():
           remaining = size - len(res)
           if remaining<=0:
               break
           # Give one second for an incoming connection so we can stop the
           # server in seconds when needed
           ready = select.select([fd], [], [], 1)
           if fd in ready[0]:
               data = self.socket.recv(min(remaining,8192)) # 8192 is
recommended by socket.socket manual.
               if not data:
                   # select returns the fd but there is no data to read
-> connection closed!
                   raise TransportError("Connection closed.")
               else:
                   res += data
           else:
               pass
       if self.stop_requested.isSet():
           raise SystemExit(0)
       return res


This works: if I close the socket on the other side, then I see this in
the traceback:

 File "/usr/home/gandalf/Python/Projects/OrbToy/orb/endpoint.py", line
233, in read_data
   raise TransportError("Connection closed.")
TransportError: Connection closed.

Also when I call stop_requested.set() then the thread stops within one
seconds.

Then I switch to non blocking mode, my code works exactly the same way,
or at least I see no difference.

I have read the socket programming howto (
http://docs.python.org/howto/sockets.html#sockets ) but it does not
explain how a blocking socket + select is different from a non blocking
socket + select. Is there any difference?

Thanks

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to