/// <summary> /// LS의 연결 상태 변동에 따른 처리 /// </summary> /// <param name="sender"></param> /// <param name="status"></param> private void LS_ConnectionStatusChanged(EventDrivenTCPClient sender, EventDrivenTCPClient.ConnectionStatus status) { if (status == EventDrivenTCPClient.ConnectionStatus.Connected) { _Main.UpdateLSinfo("Connected"); MSG_ZA2LS_CONNECT LS_Connect = new MSG_ZA2LS_CONNECT(); LS_Connect.byServerID = Config.ZA.sID; LS_Connect.byAgentID = Config.ZA.aID; LS_Connect.szZAIP = Config.ZA.IP.ToString(); LS_Connect.dwZAPort = (uint)Config.ZA.Port; LS.Send(LS_Connect.Serialize()); //LS가 종료되었다 재실행 되었을 경우를 대비하여 현재 접속 유저 정보를 LS에 알려준다. if (ZoneAgent._Players != null) { foreach (var player in ZoneAgent._Players) { MSG_ZA2LS_LOGIN_USER_LIST LS_ConnectedPlayer = new MSG_ZA2LS_LOGIN_USER_LIST(); LS_ConnectedPlayer.MsgHeader.dwPCID = player.Key; LS_ConnectedPlayer.szUserAccount = player.Value.Account; LS_ConnectedPlayer.szUserIP = player.Value.IPadress; LS.Send(LS_ConnectedPlayer.Serialize()); } } LS_Reporter.Change(0, 5000); Prepared_Checker.Change(0, 500); } else { _Main.UpdateLSinfo("Disconnected"); LS_Reporter.Change(Timeout.Infinite, Timeout.Infinite); Prepared_Checker.Change(Timeout.Infinite, Timeout.Infinite); PreparedAcc.Clear(); } }
private void ZS_DataReceived(EventDrivenTCPClient sender, object data) { try { byte[] buffer = (byte[])Convert.ChangeType(data, typeof(byte[])); List <byte[]> packetList; Packet.SplitPackets(buffer, buffer.Length, out packetList); foreach (byte[] sPacket in packetList) { byte[] packet = sPacket; Config.mConvert.Crypter.Decrypt(ref packet, ClientVer.v562); MSG_HEAD_WITH_PROTOCOL pHeader = new MSG_HEAD_WITH_PROTOCOL(); pHeader.Deserialize(ref packet); if (ZoneAgent._Players.ContainsKey(pHeader.dwPCID)) { Client client = ZoneAgent._Players[pHeader.dwPCID]; if (pHeader.byCtrl == 0x01 && pHeader.byCmd == 0xE1) { //Zone Change Packet _Main.UpdateLogMsg(string.Format("{0} {1} user zone changed {2}->{3}", client.Account, client.Uid, client.ZoneStatus, packet[0x0A])); client.ZoneStatus = packet[0x0A]; continue; } else if (pHeader.wProtocol == 0x1800) { MSG_S2C_SAY pSay = new MSG_S2C_SAY(); pSay.Deserialize(ref packet); if (pSayType.Notice == (pSayType)pSay.bySayType && "NOTICE" == pSay.szSayPC && uint.MaxValue == pSay.dwSayPCID) { ZoneAgent.szNotice = pSay.szWords; } } else if (pHeader.wProtocol == 0x1107) { //world login: save character name and town MSG_S2C_WORLD_LOGIN wLogin = new MSG_S2C_WORLD_LOGIN(); wLogin.Deserialize(ref packet); client.Character = wLogin.szPCName; client.Town = wLogin.byTown; } //encrypt후 클라이언트로 send //Config.mConvert.Convert_S2C(ref packet, client.Ver); #if DEBUG PacketLogger.LogPacket(packet, "server_to_client", client.Character); #endif ZoneAgent.Write(ref client, packet); } } } catch (Exception ex) { Logger.Write(string.Format("ZS_DataReceived: {0}", ex)); } }
/// <summary> /// LS에서 들어오는 패킷 처리 /// </summary> /// <param name="sender"></param> /// <param name="data"></param> private void LS_DataReceived(EventDrivenTCPClient sender, object data) { try { byte[] packet = (byte[])Convert.ChangeType(data, typeof(byte[])); MSG_HEAD_WITH_PROTOCOL pHeader = new MSG_HEAD_WITH_PROTOCOL(); pHeader.Deserialize(ref packet); switch (pHeader.byCtrl) { case 0x01: switch (pHeader.byCmd) { case 0xE1: //LS가 보내주는 접속할 새 클라이언트 정보 : Uid, 0A:userid(30) if (!PreparedAcc.ContainsKey(pHeader.dwPCID)) { MSG_LS2ZA_ACC_LOGIN accPrepare = new MSG_LS2ZA_ACC_LOGIN(); accPrepare.Deserialize(ref packet); PreparedAcc.Add(pHeader.dwPCID, new LSuserInfo(accPrepare.szAccount)); //zonelog update _Main.UpdateLogMsg(string.Format("<LC>UID={0} {1} Prepared", pHeader.dwPCID, accPrepare.szAccount)); } break; case 0xE3: //duplicate login; request DC to ZA from loginserver if (ZoneAgent._Players.ContainsKey(pHeader.dwPCID)) { MSG_LS2ZA_REQ_LOGOUT reqLogout = new MSG_LS2ZA_REQ_LOGOUT(); reqLogout.Deserialize(ref packet); //zonelog update _Main.UpdateLogMsg(string.Format("<LC>UID={0} {1} Dropped, Duplicate login", reqLogout.MsgHeader.dwPCID, reqLogout.szAccount)); ZoneAgent.RemoveClient(pHeader.dwPCID, reqLogout.byReason); } break; default: //any other packet received Logger.NewPacket("LS->ZA", packet, sender.IP.ToString(), ClientVer.undefined); break; } break; default: Logger.NewPacket("LS->ZA", packet, sender.IP.ToString(), ClientVer.undefined); break; } } catch (Exception ex) { Logger.Write(string.Format("LS_DataReceived: {0}", ex)); } }
private void ZS_ConnectionStatusChanged(EventDrivenTCPClient sender, EventDrivenTCPClient.ConnectionStatus status) { if (status == EventDrivenTCPClient.ConnectionStatus.Connected) { MSG_ZA2ZS_CONNECT ZS_Connect = new MSG_ZA2ZS_CONNECT(); ZS_Connect.byAgentID = Config.ZA.aID; ZS[sender.ID].Send(ZS_Connect.Serialize()); Config.ZSList[sender.ID].Status = "Connected"; } else { Config.ZSList[sender.ID].Status = "Disconnected"; } _Main.UpdateConnectedZs(); }
internal LoginServer(FrmMain frm) { _Main = frm; LS_Reporter = new Timer(LS_Report_Tick, null, Timeout.Infinite, Timeout.Infinite); Prepared_Checker = new Timer(Prepared_Checker_Tick, null, Timeout.Infinite, Timeout.Infinite); LS = new EventDrivenTCPClient(Config.LS.IP, Config.LS.Port); LS.ConnectionStatusChanged += LS_ConnectionStatusChanged; LS.DataReceived += LS_DataReceived; PreparedAcc = new Dictionary <uint, LSuserInfo>(); try { LS.Connect(); } catch { } }