Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

non-blocking socket,error is always

Tags:

python

sockets

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?

like image 241
zhenyuyang Avatar asked Jul 25 '12 09:07

zhenyuyang


1 Answers

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.

like image 165
mhawke Avatar answered Oct 15 '22 18:10

mhawke