I experience strange behavior of sockets in Python (3.2). Client connects to my application using Flash. Most of the time there is nothing unusual but sometimes python crashes in a way that should not have taken place – enter into infinite loops. Below I attach to the loop code and error message in the log. Python hang on bytesRecived = sock.recv(64) and receive b'' witch is visible in log.
code:
try:
buff = ''
allBytesRecived = []
timeout = sock.gettimeout()
sock.settimeout(10.0)
tries = 0
while len(buff) < 64 and tries < 64:
tries += 1
bytesRecived = sock.recv(64)
allBytesRecived.append(bytesRecived)
comm = str(bytesRecived, config.encoding)
buff += comm
#flash connection and his strage security policy
if buff[:24] == config.flash.policy_request:
cross = open(config.flash.crossdomain,'rb').read()
cross+=b'\x00' #end string
sock.send(cross);
raise FlashCrossdomainException()
if len(buff) < 64:
logger.critical('Hanged! buff=%s bytes=%s timeout=%s' % (repr(buff), repr(allBytesRecived), repr(sock.gettimeout())))
raise InvalidSessionException('Unknown error')
sock.settimeout(timeout)
except FlashCrossdomainException as e:
raise e
except socket.timeout:
raise InvalidSessionException('Timeout on signing in to system')
except socket.error as e:
logger.exception(e)
raise InvalidSessionException('Unknown IO error')
except Exception as e:
logger.exception(e)
raise InvalidSessionException('Unknown error')
log error:
CRITICAL: Hanged! buff='' bytes=[b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b''] timeout=10.0
python’s
socketmodule closely matches the BSD socket API.when the remote side of a socket (here, your flash client) is closed, the
recv()call on the local side (here, your python server) will return an empty string (''). there is no need to continue processing, since the client won’t send anything more: the channel is closed.on the other hand, since your socket is non-blocking, if a socket timeout occurs because the client does not send any data within the specified time limit (10 seconds), then the
recv()call will raise asocket.timeoutexception, which you can catch and process accordingly.you should add a test after the
recv()call: