sock.setblocking(0) try: data = sock.recv(1024) except socket.error, e: if e.args[0] == errno.EWOULDBLOCK: print 'EWOULDBLOCK' else: if not data: #recv over sock.close() print 'close=================' else: print 'recv ---data---------' poem += data
all above code is in a loop.using non-blocking socket
(just want to test 'non-blocking socket') to get data. But always print 'EWOULDBLOCK',i don't know why?
The socket is non-blocking so recv()
will raise an exception if there is no data to read. Note that errno.EWOULDBLOCK = errno.EAGAIN = 11. This is Python's (well the OS really) way of telling you to try the recv()
again later.
I note that you close the socket each time you get this exception. That's not going to help at all. Your code should be something like this:
import socket, errno, time sock = socket.socket() sock.connect(('hostname', 1234)) sock.setblocking(0) while True: try: data = sock.recv(1024) if not data: print "connection closed" sock.close() break else: print "Received %d bytes: '%s'" % (len(data), data) except socket.error, e: if e.args[0] == errno.EWOULDBLOCK: print 'EWOULDBLOCK' time.sleep(1) # short delay, no tight loops else: print e break
For this sort of thing, the select
module is usually the way to go.
The exception is raised by design, cause you are using non-blocking IO
.
The major mechanical difference is that send, recv, connect and accept can return without having done anything. You have (of course) a number of choices. You can check return code and error codes and generally drive yourself crazy.
Quoted from Python doc
If you run man errno 3
, you shall see the description of EWOULDBLOCK
. The exception is reasonable, because there is no data to read yet.