public static Message ConvertProtoToMessage <T>(uint type, T proto) where T : IExtensible { byte[] bytes; using (var stream = Bitstream.Create()) { Serializer.SerializeWithLengthPrefix <T>(stream, proto, PrefixStyle.Base128); bytes = stream.ToBytes(); } return(new Message() { Type = type, Data = bytes, }); }
private Packet MakePacket() { var packet = new Packet { Seq = ++sequenceOut, Ack = sequenceIn, Stream = Bitstream.Create() }; packet.Stream.SetLength(PACKET_HEADER_SIZE); packet.Stream.Position = PACKET_HEADER_SIZE * 8; return(packet); }
private void SendMessagesOutOfBand() { byte[] message; while (messagesOutOfBand.TryDequeue(out message)) { using (var stream = Bitstream.Create()) { stream.WriteUInt32(OOB_PACKET); stream.Write(message); byte[] bytes = new byte[stream.Length]; stream.Position = 0; stream.Read(bytes, 0, bytes.Length); socket.Send(bytes); } } }
public void SendUnreliably(params Message[] messages) { byte[] bytes; using (var stream = Bitstream.Create()) { foreach (var message in messages) { stream.WriteVarUInt(message.Type); stream.Write(message.Data); } bytes = stream.ToBytes(); } lock (messageLock) { // log.Debug("Queuing unreliably " + bytes.Length + " bytes"); messagesUnreliable.Enqueue(bytes); } }
public void RequestHandshake() { connection.Open(); using (var stream = Bitstream.Create()) { stream.WriteChar(C2S_REQUEST); stream.WriteUInt32(client_challenge); foreach (var c in "0000000000") { stream.WriteChar(c); } stream.WriteByte(0); connection.EnqueueOutOfBand(stream.ToBytes()); } }
public void RespondHandshake() { using (var stream = Bitstream.Create()) { stream.WriteChar(C2S_CONNECT); stream.WriteUInt32(SOURCE_VERSION); stream.WriteUInt32(STEAM_VERSION); stream.WriteUInt32(server_challenge); stream.WriteUInt32(client_challenge); stream.Write(Encoding.UTF8.GetBytes(state.CVars["name"])); stream.WriteByte(0); stream.Write(Encoding.UTF8.GetBytes(details.PassKey.ToString())); stream.WriteByte(0); // num players to join, obviously one in this case stream.WriteByte(1); // cvars stream.WriteByte((byte)CLC_Messages.clc_SplitPlayerConnect); var split = new CCLCMsg_SplitPlayerConnect(); split.convars = state.ExposeCVars(); Serializer.SerializeWithLengthPrefix(stream, split, PrefixStyle.Base128); // auth ticket var bytes = new byte[details.ServerAuthTicket.Length]; details.ServerAuthTicket.CopyTo(bytes, 0); var carry = false; for (var i = 0; i < bytes.Length; ++i) { var d = (byte)(((bytes[i] * 2) % 256) + (carry ? 1 : 0)); carry = bytes[i] > 127; bytes[i] = d; } stream.Write(bytes); connection.EnqueueOutOfBand(stream.ToBytes()); } }
public void SendReliably(params Message[] messages) { byte[] bytes; using (var stream = Bitstream.Create()) { foreach (var message in messages) { stream.WriteVarUInt(message.Type); stream.Write(message.Data); } bytes = stream.ToBytes(); } lock (messageLock) { messagesReliable.Enqueue(bytes); } }
private void SendUserCmds() { var last = new UserCmd(); using (var stream = Bitstream.Create()) { var move = new CCLCMsg_Move(); move.num_backup_commands = (uint)backup.Count; foreach (var cmd in backup) { WriteUserCmd(cmd, last, stream); last = cmd; } move.num_new_commands = (uint)next.Count; foreach (var cmd in next) { WriteUserCmd(cmd, last, stream); last = cmd; } backup.Clear(); backup.AddRange(next); next.Clear(); move.data = stream.ToBytes(); var tick = new CNETMsg_Tick(); tick.tick = state.ServerTick; connection.SendUnreliably( DotaGameConnection.ConvertProtoToMessage((uint)CLC_Messages.clc_Move, move), DotaGameConnection.ConvertProtoToMessage((uint)NET_Messages.net_Tick, tick)); } }