public void SendPacket(BasePacket packetToSend) { dataToSend.Write( BitConverter.GetBytes(1 + packetToSend.SizeOfPacket), 0, 4); dataToSend.Write(BitConverter.GetBytes('a'), 0, 1); packetToSend.Serialize(dataToSend); mFrameSentPackets.Add(packetToSend.ToString()); }
string DecodeData(byte[] data, int start, int recv, ushort senderComputerID) { char code = Encoding.ASCII.GetString(data, start, 1)[0]; MemoryStream ms = new MemoryStream(); // Sprite s; switch (code) { /* Remember, start marks the position where the code character is, so * always use start+1 when reading the actual data. */ #region 'P': Received a ping sent the other guy case 'P': // received a ping from the other guy // be sure to use start as the base number for reading from the data mTickOfLastReceievedPing = BitConverter.ToInt64(data, start + 1); // send the ping back as a reply ping // the size of the packet always goes first dataToSend.Write(BitConverter.GetBytes(9), 0, 4); // then the identifier dataToSend.WriteByte((byte)('R')); // then the contents dataToSend.Write(BitConverter.GetBytes(mTickOfLastReceievedPing), 0, 8); return("Received and replied to ping."); //break; #endregion #region 'R': Received response on sent ping, so mark how long it all took. case 'R': SecondsLastPingTook = TimeManager.CurrentTime - BitConverter.ToDouble(data, start + 1); break; #endregion #region '\t': Regular text case '\t': // text is sent this.mReceivedText.Add(Encoding.ASCII.GetString(data, start + 1, recv - 1)); return("Decoded text"); //break; #endregion #region 'N': Remote computer renamed case 'N': mNamesConnectedTo[connectedTo.IndexOf(senderComputerID)] = Encoding.ASCII.GetString(data, start + 1, recv - 1); return("Renamed Computer " + senderComputerID + " to " + mNamesConnectedTo[connectedTo.IndexOf(senderComputerID)]); //break; #endregion #region 'a': Packet case 'a': // packet MemoryStream tempStream = new MemoryStream(); tempStream.Write(data, start + 1, recv); tempStream.Position = 0; mTotalPackets++; mReceivedPackets.Add( BasePacket.Deserialize(tempStream)); return("Decoded and added packet to mReceivedPackets"); //break; #endregion #region 'b': Plain ol' bytes case 'b': // bytes ms = new MemoryStream(); ms.Write(data, start + 1, recv - 1); this.mReceivedBytes.Add(ms.ToArray()); return("Decoded bytes"); //break; #endregion case 'c': int oldID = BitConverter.ToInt32(data, start + 1); int newID = BitConverter.ToInt32(data, start + 5); NetSprite netSprite = this.GetPendingSprite(oldID, senderComputerID); this.pendingAddRemoteSprites.Remove(netSprite); netSprite.spriteID = newID; netSprite.computerID = senderComputerID; this.remoteControlledSprites.Add(netSprite); return("Decoded confirmation of Sprite ID change - moved pending to remote"); //break; case 'I': mComputerID = (ushort)BitConverter.ToChar(data, start + 1); return("Decoded assignment of computer ID assignment from the server"); //break; default: return("Data not understood.\n" + "Prefix: " + code + "\n" + "Start of data at: " + start + "\n" + "Number of bytes received: " + recv + "\n"); //break; } return("Data not understood.\n" + "Prefix: " + code + "\n" + "Start of data at: " + start + "\n" + "Number of bytes received: " + recv + "\n"); }
public void RemovePacket(BasePacket packet) { mReceivedPackets.Remove(packet); }