socket timeouts

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Nagy László Zsolt

    socket timeouts

    Hi Python Gurus!

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

    SELECT_GRANULAR ITY = 0.1 # 0.1 seconds

    def readdata(self,l ength,timeout):
    res = ''
    remain = length
    lapsed = 0.0
    while (remain > 0) and (lapsed < timeout):
    i,o,e = select.select([self.socket],[],[],SELECT_GRANULA RITY)
    lapsed = lapsed + SELECT_GRANULAR ITY
    if i:
    res = res + self.socket.rec v(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


Working...