void HandleDisconnect(Session session, DisconnectPacket p) { if (session.State == SessionState.Disconnected) { log.Info($"already disconnected: id={session.ID}"); return; } // 연결 종료는 소켓이 끊어질떄도 있고 // 유저가 직접 종료시키는 경우도 있다 // disconnect를 여러번 호출해도 꺠지지 않도록 하자 // 연결 끊은것을 연결 종료 패킷처럼 다루면 // 상위 레이어에서의 처리가 간단해진다 if (session.WorldID != null) { var leave = new WorldLeavePacket(); var codec = new PacketCodec(); var bytes = codec.Encode(leave); var pair = new ReceivedPacket <WorldLeavePacket>(session, bytes); HandleWorldLeave(session, pair); } log.Info($"disconnect: id={session.ID}"); var disconnect = new DisconnectPacket(); session.SendLazy(disconnect); // 연결 끊어도 된다는 표시 해두기. 언제 끊어도 상관 없어야한다 NetworkStack.Session.CloseSessionActive(session); }
void HandleLeaveReq(Session session, WorldLeavePacket p) { var holder = GetPlayerHolder(session); if (holder.Mode == PlayerMode.Player) { room.Leave(holder.Player); } else if (holder.Mode == PlayerMode.Observer) { room.Leave(holder.Observer); } else { return; } var ok = Leave(session); log.Info($"world leave: id={session.ID} world={ID} ok={ok} size={sessions.Count}"); var resp = new WorldLeaveResultPacket(session.ID); session.SendLazy(resp); }
public async Task <bool> WorldLeave() { var send = new WorldLeavePacket(); var recv = await conn.SendRecv <WorldLeavePacket, WorldLeaveResultPacket>(send); return(true); }
public void TestSerde() { var a = new WorldLeavePacket() { }; var b = SerializeAndDeserialize(a); Assert.Equal(a, b); }