private void ParsePacket(byte[] packetData, NetworkManager netManager) { int packetType = packetData[0]; try { IncomingPacket packet = null; //remove header byte[] tmp = new byte[packetData.Length - 1]; Array.Copy(packetData, 1, tmp, 0, tmp.Length); packetData = tmp; switch (packetType) { ///////////////////////////////// case 4: packet = new SystemMessage00(); break; case 5: packet = new KeepAliveAnswer00(netManager); break; case 6: packet = new AuthSuccess00(netManager); break; case 7: packet = new PlayerInfo00(); break; case 8: packet = new SayToChat00(); break; //////////////////////////////////////// default: ClientLog.LogPacket("UNKNOWN PACKET => ", packetType, packetData, true); break; } if (packet != null) { packet.SetData(packetType, packetData); } ClientLog.LogPacket("client<=server ", packetType, packetData, false); } catch (Exception exc) { ClientLog.LogPacket("PROBLEM PARSING PACKET => ", packetType, packetData, true); if (exc.Message != null) { Debug.Log("ERR: " + exc.Message); } } }
// =============== отправка пакетов============================= public void SendPacket(OutgoingPacket packet) { if (!clientConnected) { return; } byte[] data = packet.GetData(); ClientLog.LogPacket("client=>server ", 0, data, false); //добавляем длину пакета var list = new List <byte>(data); byte[] cryptCheaper = new byte[2]; int a1 = UnityEngine.Random.Range(6, 250); int a2 = UnityEngine.Random.Range(1, 31); cryptCheaper[0] = (byte)a1; cryptCheaper[1] = (byte)a2; list.InsertRange(0, cryptCheaper); list.InsertRange(0, BitConverter.GetBytes((Int16)(data.Length + 4))); data = list.ToArray(); bool thisIsLogoutPacket = false; if (packet is SendLogout00) { thisIsLogoutPacket = true; } SendData(data, thisIsLogoutPacket); }
// =============== прием пакетов============================= private void DoRead(IAsyncResult ar) { if (!clientConnected) { ClearBuffer(); return; } int countBytesRead; try { //if (!testMode) countBytesRead = client.GetStream().EndRead(ar); //это код ошибки соединения. разрываем соединение. if (countBytesRead < 1) { Disconnect(true); return; } //if (testMode) // countBytesRead = testreciviedCountBytes; //сохраняем в рабочий буфер, то что пришло из только что полученного. Array.Copy(readBuffer, 0, receivedBuffer, receivedBufferPos, countBytesRead); receivedBufferPos += countBytesRead; if (receivedBufferPos < 5) { Debug.Log("not bug. dont worry. info-packet header no full"); BeginRead(); return; } int packetSizeWithHeader = GetPacketSizeWithHeaderSize(0); //ClientLog.LogFullBuffer(readBuffer); // ClientLog.LogBuffer(receivedBuffer, 200); if (IsWrongPacketSize(packetSizeWithHeader)) { ClearBuffer(); BeginRead(); return; } // проверка того что пакет пришел полностью. в буфере меньше чем длина пакета. if (packetSizeWithHeader > receivedBufferPos) { BeginRead(); return; } int iterations = 0; //читаем пакеты из массива перемещая индекс на положение нового пакета int NextPacketIndex = 0; while (iterations < 300) { iterations++; //определяем размер пакета без заголовка int packetSize = GetPacketSizeWithHeaderSize(NextPacketIndex) - PACKET_HEADER_SIZE; if (IsWrongPacketSize(packetSize)) { ClearBuffer(); BeginRead(); return; } //Debug.Log("a=" + "b=" + packetSize); //создаем массив содержащий пакет без заголовка byte[] packetBuffer = new byte[packetSize]; Array.Copy(receivedBuffer, NextPacketIndex + PACKET_HEADER_SIZE, packetBuffer, 0, packetSize); //передача единичного пакета в основной поток на обработку. packetParser.AddPacket(packetBuffer); if (Settings.packetLoggingEnabled) { ClientLog.LogPacket("add", packetBuffer[0], packetBuffer, true); } //увеличиваем индекс на положение следующего пакета NextPacketIndex += packetSize + PACKET_HEADER_SIZE; //буфер достиг конца. if (NextPacketIndex >= receivedBufferPos) { ClearBuffer(); BeginRead(); return; } //в буфере еще не пришла вся инфо о длине следующего пакета if (receivedBufferPos - NextPacketIndex < 5) { // Debug.Log("not bug2. dont worry. packet header no full"); CompactBuffer(NextPacketIndex); BeginRead(); return; } //этот пакет пришел не до конца. ждем когда придет оставщийся кусок. int packetSizeWithHeader2 = GetPacketSizeWithHeaderSize(NextPacketIndex); if (packetSizeWithHeader2 + NextPacketIndex > receivedBufferPos) { //Debug.Log("not bug. packet no full"); CompactBuffer(NextPacketIndex); BeginRead(); return; } //значит в буфере есть еще готовый пакет. возвращаемся к началу цикла. } } catch (IOException ex) { Debug.Log("errorIO: " + ex); Disconnect(true); return; } catch (Exception ex) { Debug.Log("error : " + ex); Disconnect(true); } }