or rather timeout = s.gettimeout() b=time.clock() while time.clock()-b<3 : s.settimeout(3-time.clock()+b) try : data=s.recv(1024) except : break s.settimeout(timeout)
Sorry for all these messages Dwayne 2011/2/4 Dwayne Blind <dwaynebl...@gmail.com> > The solution would be > > > timeout = s.gettimeout() > s.settimeout(3) > b=time.clock() > while time.clock()-b<3 : > try : > data=s.recv(1024) > except : > break > s.settimeout(timeout) > > Am I right ? > > Dwayne > > 2011/2/4 Dwayne Blind <dwaynebl...@gmail.com> > > Thanks Stephen. It's really nice of you. >> >> I have not understood everything though. (I have never used a context >> manager before.) >> >> Here are some comments : >> >> timeout = s.gettimeout() # Is that the default timeout ? >> s.settimeout(3) # I guess this is a 3 second timeout >> s.recv(1024) >> s.settimeout(timeout) # You change it back ? >> >> So with a while loop, it should be : >> >> >> timeout = s.gettimeout() >> s.settimeout(3) >> b=time.clock() >> while time.clock()-b<3 : >> >> data=s.recv(1024) >> s.settimeout(timeout) >> >> Am I right ? >> >> Thanks again, >> Dwayne >> >> >> 2011/2/3 Stephen Hansen <me+list/pyt...@ixokai.io> >> >>> On 2/3/11 10:13 AM, Dwayne Blind wrote: >>> >>> > Thanks for your answer. I don't want to reset my socket. I want to >>> apply >>> > the timeout to the rcv method only. >>> >>> Setting the timeout does not "reset [your] socket", I don't think. And I >>> get that you want to only timeout recv... that's why I pointed out its a >>> socket method, not an argument to recv. If you don't want it to apply to >>> everything else, you just have to be sure to change it back after recv. >>> >>> Just: >>> timeout = s.gettimeout() >>> s.settimeout(3) >>> s.recv(1024) >>> s.settimeout(timeout) >>> >>> Personally, I'd prefer to do: >>> >>> with timeout(s, 3): >>> s.recv(1024) >>> >>> That's a lot more clear, and I'd roll this context manager to accomplish >>> it: >>> >>> --- start >>> >>> from contextlib import contextmanager >>> >>> @contextmanager >>> def timeout(sock, timeout): >>> old_timeout = sock.gettimeout() >>> sock.settimeout(timeout) >>> try: >>> yield sock >>> finally: >>> sock.settimeout(old_timeout) >>> >>> --- end >>> >>> The contextmanager decorator is an easy/quick way of making a context >>> manager. Everything up until the yield is executed before the 'with' >>> block is run, and everything after the yield is executed after the >>> 'with' block concludes. >>> >>> If the with block throws an exception, it'll be catchable at the yield >>> point. >>> >>> -- >>> >>> Stephen Hansen >>> ... Also: Ixokai >>> ... Mail: me+list/python (AT) ixokai (DOT) io >>> ... Blog: http://meh.ixokai.io/ >>> >>> >> >
-- http://mail.python.org/mailman/listinfo/python-list