def run(self):
if self.sck_side_A is not None and self.sck_side_B is not None:
logger = logging.getLogger("logger")
logger.info("%s start"%self.getName())
set_sock_buff_size(self.sck_side_A)
set_sock_buff_size(self.sck_side_B)
#send cached data
if self.cached_data_from_A:
self.send_all(self.sck_side_B, self.cached_data_from_A)
if self.cached_data_from_B:
self.send_all(self.sck_side_A, self.cached_data_from_B)
scks = (self.sck_side_A, self.sck_side_B)
while self.forwarding:
try:
readable,writeable,exceptional = select.select(scks,[],scks, 1)
for s in readable:
data = recv(s, BUFFER_SIZE)
if len(data):
if s == self.sck_side_A:
#self.sck_side_B.sendall(data)
self.send_all(self.sck_side_B, data)
else:
#self.sck_side_A.sendall(data)
self.send_all(self.sck_side_A, data)
else:
# remote closed
self.forwarding = False
break
for s in exceptional:
socket.getpeername()
peer_addr, peer_port = s.getpeername()
local_addr, local_port = s.getsockname(self)
logger.error("socket in exceptional %s:%d->%s:%d"%(local_addr, local_port, peer_addr, peer_port))
self.forwarding = False
break
except socket.error,e:
logger.error(traceback.format_exc())
self.forwarding = False
except Exception, e:
logger.error(traceback.format_exc())
self.forwarding = False
if self.sck_side_A is not None:
safe_close_socket(self.sck_side_A)
if self.sck_side_B is not None:
safe_close_socket(self.sck_side_B)
logger.info("%s end"%self.getName())
评论列表
文章目录