I'm writing a simple TCP relay server, which is gonna be deployed both on a Windows and a Linux machine (same code base). Naturally there're gonna be two sockets to work with. I would like to know which exceptions exactly do get raised for the following cases:
recv()returns when no data is available to read.sendall()cannot complete (dispose of the whole to-send data)
- Do I have to check for both errnos (
socket.EWOULDBLOCKandsocket.EAGAIN) when expecting to return from a non-blocking socketsrecv()? - Which
errno(.args[0]) do I get whensendall()fails?
Here's my code so far:
try:
socket1.setblocking(False)
socket2.setblocking(False)
while True:
try:
sock1_data = socket1.recv(1024)
if sock1_data:
socket2.sendall(sock1_data)
except socket.error as e:
if e.args[0] != socket.EAGAIN and e.args[0] != socket.EWOULDBLOCK:
raise e
try:
sock2_data = socket2.recv(1024)
if sock2_data:
socket1.sendall(sock2_data)
except socket.error as e:
if e.args[0] != socket.EAGAIN and e.args[0] != socket.EWOULDBLOCK:
raise e
except:
pass
finally:
if socket2:
socket2.close()
if socket1:
socket1.close()
My main concern is: What socket.error.errno do I get when sendall() fails?
Lest the socket.error.errno I get from a failing sendall() is EAGAIN or EWOULDBLOCK, in which case it'd be troubling!!
Also, do I have to check for both EAGAIN and EWOULDBLOCK when handling a non-blocking recv()?
from Python socket non-blocking recv() exception(s) and sendall() exception
No comments:
Post a Comment