#if len(data) <= 0:
# break
#client_socket.send(data)
#continue
header = self.get_header(client_socket)
print struct.unpack("=%dB" % len(header), header)
body = self.get_body(client_socket)
# 解析数据
if not self.process_data(header, body, client_socket):
client_socket.sendall(header + self.make_body(body))
print "【网关】", body
###############################################################################
# 模拟线服务器 #
###############################################################################
class my_server:
def __init__(self):
print "Server init...\n"
def __del__(self):
print "Server del...\n"
def make_game_header(self, cmd, seq):
ret = struct.pack("=BBH", 0x68, seq, cmd)
return ret
def make_header(self, cmd, gate_index, line_index):
ret = struct.pack("=BBHH", 0x69, cmd, gate_index, line_index)
return ret
def make_body(self, data):
length = len(data)
ret = struct.pack("=H", length)
# 加密data ........
#tmp = struct.unpack("=%dB" % length, data)
#tmp2 = []
#for c in tmp:
# tmp2.append(c ^ 0xAA)
#data = struct.pack("=%dB" % length, *(i for i in tmp2))
# 加密end
ret += data
return ret
# 接收指定长度的数据
def get_respond(self, s, expect_len):
buf = ""
while len(buf) < expect_len:
data = s.recv(expect_len - len(buf))
if not data:
# 连接断开
raise Exception("服务器连接断开")
buf += data
return buf
def get_header(self, s):
return self.get_respond(s, 6)
def get_body(self, s):
ret = self.get_respond(s, 2)
data = struct.unpack("=H", ret)
print "Data len %d" % data[0]
length = data[0]
data = self.get_respond(s, length)
# 解密data ........
#tmp = struct.unpack("=%dB" % length, data)
#tmp2 = []
#for c in tmp:
# tmp2.append(c ^ 0xAA)
#data = struct.pack("=%dB" % length, *(i for i in tmp2))
# 解密end
return data
def process_data(self, header, body, client_socket):
flag, type, gate_index, server_index = struct.unpack("=BBHH", header)
if type == 0x02: #控制块释放命令
return 2
# 取游戏包头
game_header = body[0 : 4]
#print struct.unpack("=4B", body[0:4])
flag, seq, command = struct.unpack("=BHB", game_header)
if command == 0x02:
# 登陆包
game_body = body[6 : ]
# print struct.unpack("=%dB" % len(body[4:]), body[4:])
line_no, user, password = struct.unpack("=B16s32s", game_body)
print "【线服务器】用户 %s 密码 %s 登陆到服务器 %d" % (user, password, line_no)
# 组游戏包
game_pkt = self.make_game_header(0x82, 0) + self.make_body(struct.pack("=B", 0))