socket timeouts

  • Thread starter =?ISO-8859-2?Q?Nagy_L=E1szl=F3_Zsolt?=
  • Start date
?

=?ISO-8859-2?Q?Nagy_L=E1szl=F3_Zsolt?=

Hi Python Gurus!

Here is a method I used before to receive data over a socket (with
Python 2.2):

SELECT_GRANULARITY = 0.1 # 0.1 seconds

def readdata(self,length,timeout):
res = ''
remain = length
lapsed = 0.0
while (remain > 0) and (lapsed < timeout):
i,o,e = select.select([self.socket],[],[],SELECT_GRANULARITY)
lapsed = lapsed + SELECT_GRANULARITY
if i:
res = res + self.socket.recv(remain)
remain = length - len(res)
if remain > 0:
raise TimeOutError
else:
return res

I used a very similar code to send data over a socket. Now in Python
2.3, we have
the wonderful settimeout() method. Here is my problem. Suppose that the
other
side (sender) is rather slow. I want to receive 1MB data in 20 seconds
(at most). Probably
the socket socket.recv() call will not return all data after the first
call. So my old method
is continuously trying to receive data until the timeout arrives (or it
will return sooner if all data
was received). This worked flawlessly with Python 2.2. With the new api,
it is possible to
use settimeout() instead of the select.select() call. However, recv()
will not return
all the 1MB data after the first call either. No matter what was the
timeout, it will give up
receiving when the input buffer becomes empty. So I still need to
receive data in a while loop.
What are the benefits and drawback of this solution with the new
settimeout() method?

I read the library reference documentation about compatibility. There is
not a word about
what platforms support the settimeout() method so I suppose all
platforms support this. As
opposed to select.select which is not available on every OS. There is a
note for the select module::

"This module provides access to the select() and poll() functions
available in most operating systems."

A proposal: It would be nice to have a recvall() method with a length
parameter. Suggestions,
comments are welcome.

Thank you in advance,

Laci 1.0
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,050
Latest member
AngelS122

Latest Threads

Top