Quetion about flags of socket.recv(bufsize, [flags])

Steve Holden steve at holdenweb.com
Sun Feb 8 11:09:15 EST 2009


Ken wrote:
> I want to receive 4 bytes from a connected socket, I code like this:
> 
> data = sock.recv(4)
> 
> There is a problem with above code. The recv method will not block until
> it get all 4 bytes. So I use the second param of recv method like this
> 
> data = sock.recv(4, socket.MSG_WAITALL)
> 
> This works fine on linux with python 2.5, while on windows, the
> interpreter tells me 'AttributeError: 'module' object has no attribute
> 'MSG_WAITALL''.  How can I work this out, or there is another way to get
> certain bytes from a socket and block if it hasn't got enough bytes?
> 
If you *need* 4 bytes then the best way to receive them is simply to
loop until you get them (assuming you are using blocking sockets):

BLOCKSIZE = 4
buffer = ""
while len(buffer) < BLOCKSIZE:
  data = sock.recv(BLOCKSIZE-len(buffer))
  if not data:
    break # other end is closed!
  buffer += data

regards
 Steve
-- 
Steve Holden        +1 571 484 6266   +1 800 494 3119
Holden Web LLC              http://www.holdenweb.com/




More information about the Python-list mailing list