public void Enqueue(Packetinterface rowPacket) { lock (PacketQueue) { PacketQueue.Enqueue(rowPacket); } }
public void receive() { if (stream_.DataAvailable) { Byte[] packetByte = new Byte[client_.ReceiveBufferSize]; Int32 offset = 0; Int32 readLen = stream_.Read(packetByte, offset, packetByte.Length); PacketObfuscation.decodingHeader(ref packetByte, sizeof(Int32)); Int32 packetLen = PacketUtil.decodePacketLen(packetByte, ref offset); while (readLen < packetLen) { Byte[] remainPacket = new Byte[client_.ReceiveBufferSize]; Int32 remainLen = 0; remainLen = stream_.Read(remainPacket, 0, remainPacket.Length); Buffer.BlockCopy(remainPacket, 0, packetByte, readLen, remainLen); readLen += remainLen; } Byte[] packetData = new Byte[client_.ReceiveBufferSize]; Buffer.BlockCopy(packetByte, offset, packetData, 0, readLen - offset); PacketObfuscation.decodingData(ref packetData, packetData.Length); Packetinterface rowPacket = PacketUtil.packetAnalyzer(packetData); if (rowPacket == null && this.isConnected()) { Debug.Log("잘못된 패킷이 수신되었습니다."); } ContentsProcee_.run(rowPacket); } }
// 로그인 과 채팅은 상관없는데 게임은함수포인터맵으로 바꾸는게 좋을듯함 public override void run(Packetinterface packet) { PacketType type = (PacketType)packet.type(); Debug.Log("받은 로그인 패킷" + type); switch (type) { case PacketType.E_S_ANS_ID_PW_FAIL: LoginPacketProcess.S_ANS_ID_PW_FAIL(packet); return; case PacketType.E_S_ANS_ID_PW_SUCCESS_CHATTING: LoginPacketProcess.S_ANS_ID_PW_FAIL(packet); return; case PacketType.E_S_ANS_ID_PW_SUCCESS_GAME: LoginPacketProcess.S_ANS_ID_PW_SUCCESS_GAME(packet); return; case PacketType.E_S_ANS_EXIT: return; } if (base.defaultRun(packet) == false) { # if DEBUG Debug.Log("잘못된 패킷이 수신되었습니다. : "); Debug.Log(type); #endif }
public void S_ANS_MOVE(Packetinterface rowPacket) { PK_S_ANS_MOVE packet = (PK_S_ANS_MOVE)rowPacket; //GameManager.getInstance.MoveCharacter(packet.steering, packet.accel, packet.footbrake, packet.handbrake); GameManager.getInstance.MoveEnemy(packet.steering, packet.accel, packet.footbrake, packet.handbrake); }
public void S_NOTIFY_CLIENT_DATA(Packetinterface rowPacket) { PK_S_NOTIFY_OTHER_CLIENT packet = (PK_S_NOTIFY_OTHER_CLIENT)rowPacket; Debug.Log("Recive S_NOTIFY_OTHER_CLIENT EnemyNumber : " + packet.userNumber.ToString()); GameManager.getInstance.SetCharacterPostition(packet.userNumber, packet.pos_X, packet.pos_Y); }
public void S_NOTIFY_USER_DATA(Packetinterface rowPacket) { PK_S_NOTIFY_USER_DATA packet = (PK_S_NOTIFY_USER_DATA)rowPacket; Debug.Log("Recive S_NOTIFY_USER_DATA"); packet.userNumber = GameManager.getInstance.userCar; GameManager.getInstance.SetCharacterPostition(packet.userNumber, packet.pos_X, packet.pos_Y); }
public void S_ANS_ID_PW_SUCCESS_GAME(Packetinterface rowPacket) { PK_S_ANS_ID_PW_SUCCESS_GAME packet = (PK_S_ANS_ID_PW_SUCCESS_GAME)rowPacket; GameNetWork.getInstance.name_ = packet.name_; GameNetWork.getInstance.Open(packet.ip_, packet.port_); PK_C_REQ_REGIST_GAMING_CHARACTER_INFO retPacket = new PK_C_REQ_REGIST_GAMING_CHARACTER_INFO(); retPacket.name_ = packet.name_; GameNetWork.getInstance.sendPacket(retPacket); SceneChange.getInstance.ChangeScene("RoomScene"); }
public override void parse(Packetinterface packet) { PacketType type = (PacketType)packet.getType(); Debug.Log("받은 게임 패킷 : " + type); switch (type) { case PacketType.E_S_ANS_EXIT: gamePacketProcess.S_ANS_EXIT(packet); return; case PacketType.E_S_ANS_CONNECT: gamePacketProcess.S_ANS_CONNECT(packet); return; case PacketType.E_S_NOTIFY_OTHER_CLIENT: gamePacketProcess.S_NOTIFY_CLIENT_DATA(packet); return; case PacketType.E_S_ANS_MOVE: gamePacketProcess.S_ANS_MOVE(packet); return; case PacketType.E_S_NOTIFY_USER_DATA: gamePacketProcess.S_NOTIFY_USER_DATA(packet); return; default: Debug.Log("잘못된 패킷이 수신되었습니다. : "); Debug.Log(type); break; } /* * if (base.defaultRun(packet) == false) * { #if DEBUG * Debug.Log("잘못된 패킷이 수신되었습니다. : "); * Debug.Log(type); #endif * } */ }
public override void run(Packetinterface packet) { PacketType type = (PacketType)packet.type(); Debug.Log("받은 게임 패킷 : " + type); switch (type) { case PacketType.E_S_ANS_GAME_EXIT: gamePacketProcess.S_ANS_EXIT(packet); return; } if (base.defaultRun(packet) == false) { #if DEBUG Debug.Log("잘못된 패킷이 수신되었습니다 : "); #endif } }
public static Packetinterface packetAnalyzer(Byte[] packetByte, int totalOffset) { Int32 offset = 0; Int32 packetType = PacketUtil.decodeInt32(packetByte, ref offset); Packetinterface packet = PacketFactory.getPacket(packetType); if (packet == null) { Debug.Log("packet Analyzer failed"); return(null); } // 데이터가 있으면 decoding 해서 넘기기 if (offset < totalOffset) { packet.decode(packetByte, ref offset); } return(packet); }
public static Packetinterface packetAnalyzer(Byte[] packetByte) { Int32 offset = 0; Int64 packetType = PacketUtil.decodePacketType(packetByte, ref offset); Packetinterface packet = PacketFactory.getPacket(packetType); if (packet == null) { Console.Write("packet Analyzer failed"); return(null); } // 데이터가 있으면 decoding 해서 넘기기 if (offset < packetByte.Length) { packet.decode(packetByte, ref offset); } return(packet); }
public void S_ANS_CONNECT(Packetinterface rowPacket) { PK_S_ANS_CONNECT packet = (PK_S_ANS_CONNECT)rowPacket; if (packet.userNumber == 0) { GameManager.getInstance.userCar = 0; GameManager.getInstance.enemyCar = 1; } else { GameManager.getInstance.userCar = 1; GameManager.getInstance.enemyCar = 0; } GameManager.getInstance.CreateMainCharacter(); GameManager.getInstance.CreateEnemyCharacter(); }
public void sendPacket(Packetinterface packet) { try { packet.encode(); //Header -> data 순으로 바이트변환후 packet내 외부스트림에 저장 MemoryStream packetBlock = new MemoryStream(); Int32 packetLen = sizeof(Int32) + (Int32)packet.getStream().Length; Byte[] packetHeader = BitConverter.GetBytes(packetLen); //packetHeader는 Packet의 총길이 PacketObfuscation.encodingHeader(ref packetHeader, (int)packetHeader.Length); //길이 암호화 packetBlock.Write(packetHeader, 0, (Int32)packetHeader.Length); Byte[] packetData = packet.getStream().ToArray(); PacketObfuscation.encodingData(ref packetData, (int)packetData.Length); packetBlock.Write(packetData, 0, (Int32)packetData.Length); //실데이터 암호화후 블럭에 넣음 Byte[] packetBytes = packetBlock.ToArray(); // 블럭을 바이트로 변환 stream_.Write(packetBytes, 0, (int)packetBlock.Length); stream_.Flush(); packetBlock = null; }catch (Exception e) { if (this.isConnected()) { Debug.Log("잘못된 처리 : send " + e.ToString()); } } }
public void sendPacket(Packetinterface packet) { //Debug.Log("Send Packet : " + packet.GetType().ToString()); try { packet.encode(); //Header -> data 순으로 바이트변환후 packet내 외부스트림에 저장 MemoryStream packetBlock = new MemoryStream(); Int32 packetLen = sizeof(Int32) + (Int32)packet.getStream().Length; Byte[] packetHeader = BitConverter.GetBytes(packetLen); //packetHeader는 Packet의 총길이 packetBlock.Write(packetHeader, 0, (Int32)packetHeader.Length); Byte[] packetData = packet.getStream().ToArray(); packetBlock.Write(packetData, 0, (Int32)packetData.Length); Byte[] packetBytes = packetBlock.ToArray(); // 블럭을 바이트로 변환 //Debug.Log("Send Size : " + packetBytes.Length.ToString()); socket.Send(packetBytes); // stream_.Write(packetBytes,0, (int)packetBlock.Length); // stream_.Flush(); packetBlock = null; }catch (Exception e) { if (this.isConnected()) { Debug.Log("잘못된 처리 : send " + e.ToString()); } } }
public override void S_ANS_EXIT(Packetinterface rowPacket) { }
public void S_ANS_EXIT(Packetinterface rowPacket) { PK_S_ANS_EXIT packet = (PK_S_ANS_EXIT)rowPacket; GameManager.getInstance.DeleteCharacter(packet.userNumber); }
public void S_ANS_ID_PW_SUCCESS_CHATTING(Packetinterface rowPacket) { }
public void sendPacket(Packetinterface packet) { network.sendPacket(packet); }
public abstract void S_ANS_EXIT(Packetinterface rowPacket);
public abstract void run(Packetinterface packet);
private void receive_CallBack(IAsyncResult ar) { Data data = (Data)ar.AsyncState; Socket localSocket = data.socket; Byte[] packetHeader = new Byte[sizeof(Int32)]; Byte[] packetBody = new Byte[1024]; // 임의 크기로 해놈 Int32 readLen = localSocket.EndReceive(ar); if (readLen == 0) { Debug.Log("Zero Receive Error"); return; } //들어온 크기만 큼 packetByte에 복사한다. Buffer.BlockCopy(data.buff, 0, packetBytes, totalBytes, readLen); totalBytes += readLen; Debug.Log("Receive Size : " + readLen.ToString() + "TotalBytes Size : " + totalBytes.ToString()); while (totalBytes > 0) { // Array.Clear(packetHeader, 0, sizeof(Int32)); // Array.Clear(packetBody, 0, sizeof(Byte) * 1024); Int32 currentOffset = 0; Int32 offset = 0; Buffer.BlockCopy(packetBytes, currentOffset, packetHeader, 0, sizeof(Int32)); // //packet 버퍼에 있는 크기가 헤더 이하이면 if (totalBytes < BitConverter.ToInt32(packetHeader, 0)) { Debug.Log("totalBytes is not enough "); break; //localSocket.BeginReceive(data.buff, 0, Data.BuffSize, 0, new AsyncCallback(receive_CallBack), data); //return; } //packet 버퍼에 있는 크기가 헤더 이상이라면 //packetHeader 에 packetheader 만큼 복사. // Buffer.BlockCopy(packetBytes, currentOffset, packetHeader, 0, sizeof(Int32)); // currentOffset += sizeof(Int32); // packetByte의 offset 변경 // 패킷 총 길이를 가져옴. + offset 증가 Int32 packetLen = PacketUtil.decodePacketLen(packetHeader, ref offset); packetLen -= offset; int remainBytes = totalBytes - currentOffset; // packetData에서 헤더를 제외한 남은 바이트 if (remainBytes < packetLen) { Debug.Log("remainBytes is Not enough"); break; //localSocket.BeginReceive(data.buff, 0, Data.BuffSize, 0, new AsyncCallback(receive_CallBack), data); /* * * */ //return; } // currentOffset 은 패킷 헤더 이후의 offset Buffer.BlockCopy(packetBytes, currentOffset, packetBody, 0, packetLen); currentOffset += packetLen; Packetinterface rowPacket = PacketUtil.packetAnalyzer(packetBody, packetLen); Debug.Log("Receive Packet : " + rowPacket.getType().ToString()); if (rowPacket == null && localSocket.Connected) { Debug.Log("잘못된 패킷이 수신되었습니다."); } // 큐 구분 해야됨. if (PacketQueue == readPacketQueue) { lock (writePacketQueue) { writePacketQueue.Enqueue(rowPacket); } } else { lock (readPacketQueue) { readPacketQueue.Enqueue(rowPacket); } } //writePacketQueue //Enqueue(rowPacket); //packetBytes 를 사용 했으므로 data 및 offset 수정 // Buffer.BlockCopy(packetBytes, 0, packetBytes, currentOffset, totalBytes - currentOffset); Buffer.BlockCopy(packetBytes, currentOffset, packetBytes, 0, totalBytes - currentOffset); totalBytes -= currentOffset; /* * 생각할 수 있는 것은 Client에서의 Enqueue 와 Dequeue 사이에서 Lock으로 인한 병목현상이다. * 클라이언트의 Network 는 하나의 스레드가 온전히 recv 하고 enqueue 를 실행하지만 * 클라이언트의 Unity Script 에서는 하나의 스레드가 실행 시간을 나누어 dequeue를 실행한다 * * * 11/20 * * PacketQueue 에서 Dequeue 하는 부분의 Corutine의 갯수를 증가시켰을때 * 전 보다 싱크 의 차이가 줄어드는 것을 확인할 수 있었음. * 즉 병목현상이 맞다고 판단 -> Server와 동일하게 두 개의 버퍼를 만들어 스왚하는 로직을 통해 해소해보자. */ } Array.Clear(data.buff, 0, readLen); localSocket.BeginReceive(data.buff, 0, Data.BuffSize, 0, new AsyncCallback(receive_CallBack), data); }
public bool defaultRun(Packetinterface packet) { return(false); }
public abstract void parse(Packetinterface packet);
public void S_ANS_ID_PW_FAIL(Packetinterface rowPacket) { Debug.Log("로그인 실패"); }
public bool defaultRun(Packetinterface packet) { PacketType type = (PacketType)packet.type(); return(false); }