def stk_login_ack(self, data): global updatedata, socklist, updateinfo passwd = user.stk_get_pass(self.uid) result = 0 passtmp, reversetmp = struct.unpack("!32s64s", data) passnew = passtmp.strip("\000") if passwd == "STK_UNKNOWN_USER": result = 2 elif self.state == 1: result = 1 elif passwd == passnew: print "STK Client %s(%u) is Login in." % (user.stk_get_nickname(self.uid), self.uid) self.state = 1 socklist[self.uid] = [self.sock, self.state] # Notify ui to update updateinfo.append([self.uid, u"online"]) result = 0 else: result = 3 buf = struct.pack( "!2sHHHIIBBHBB", STK_MAGIC, STK_VERSION, COMMANDS["LOGIN"], self.sid, self.uid, self.token, self.reverse, STK_SERVER_FLAG, 1, result, STK_END, ) self.sock.send(buf)
def stk_socket_thread(t): c = t[0] client = StkClient(c) while 1: try: buf = c.recv(STK_MAX_PACKET_SIZE) # socket.timeout or socket.error or ... except socket.timeout: global running if running == False: break except socket.error: # Whatever, error happen, just exit break else: size = len(buf) if size == -1: print "Recv Socket Error." break elif size == 0: print "Peer Socket Shutdown." break elif size > STK_MAX_PACKET_SIZE: print "Drop Packet(Too Large)." break else: pass h = StkPacket(buf) # h.show_stk_head() if h.check_head_valid() != True: print "Bad STK Packet." continue cmd = h.get_stk_cmd() uid = h.get_stk_uid() sid = h.get_stk_sid() data = h.get_stk_data() length = h.get_stk_len() del h if cmd == COMMANDS["REQ_LOGIN"]: client.stk_set_client(uid, sid) client.stk_reqlog_ack(data) elif cmd == COMMANDS["LOGIN"]: client.stk_login_ack(data) elif cmd == COMMANDS["KEEPALIVE"]: client.stk_keepalive_ack(data) elif cmd == COMMANDS["LOGOUT"]: pass elif cmd == COMMANDS["GET_USER"]: client.stk_getuser_ack(data) elif cmd == COMMANDS["GET_ONLINE_USER"]: client.stk_getonlineuser_ack(data) elif cmd == COMMANDS["GET_USER_INFO"]: client.stk_getuserinfo_ack(data) elif cmd == COMMANDS["GET_GROUP"]: client.stk_getgroup_ack(data) elif cmd == COMMANDS["GET_GROUP_INFO"]: client.stk_getgroupinfo_ack(data) elif cmd == COMMANDS["SEND_MSG"]: client.stk_sendmsg_ack(data) elif cmd == COMMANDS["REPLY_MSG"]: pass elif cmd == COMMANDS["SEND_GMSG"]: client.stk_sendgmsg_ack(data) elif cmd == COMMANDS["REPLY_GMSG"]: pass else: print "Unknow Command, Drop." pass c.close # Notify ui to update global socklist, updateinfo socklist[uid] = [None, 0] updateinfo.append([uid, u"offline"]) print "Client socket thread exiting..."