Feedback on Optimizing C# NET Code Block

Posted by Brett Powell on Stack Overflow See other posts from Stack Overflow or by Brett Powell
Published on 2011-03-12T15:51:34Z Indexed on 2011/03/12 16:10 UTC
Read the original article Hit count: 198

Filed under:
|
|
|
|

I just spent quite a few hours reading up on TCP servers and my desired protocol I was trying to implement, and finally got everything working great. I noticed the code looks like absolute bollocks (is the the correct usage? Im not a brit) and would like some feedback on optimizing it, mostly for reuse and readability.

The packet formats are always int, int, int, string, string.

        try
        {
            BinaryReader reader = new BinaryReader(clientStream);
            int packetsize = reader.ReadInt32();
            int requestid = reader.ReadInt32();
            int serverdata = reader.ReadInt32();
            Console.WriteLine("Packet Size: {0} RequestID: {1} ServerData: {2}", packetsize, requestid, serverdata);

            List<byte> str = new List<byte>();
            byte nextByte = reader.ReadByte();

            while (nextByte != 0)
            {
                str.Add(nextByte);
                nextByte = reader.ReadByte();
            }

            // Password Sent to be Authenticated
            string string1 = Encoding.UTF8.GetString(str.ToArray());

            str.Clear();
            nextByte = reader.ReadByte();

            while (nextByte != 0)
            {
                str.Add(nextByte);
                nextByte = reader.ReadByte();
            }

            // NULL string
            string string2 = Encoding.UTF8.GetString(str.ToArray());

            Console.WriteLine("String1: {0} String2: {1}", string1, string2);

            // Reply to Authentication Request
            MemoryStream stream = new MemoryStream();
            BinaryWriter writer = new BinaryWriter(stream);

            writer.Write((int)(1)); // Packet Size
            writer.Write((int)(requestid)); // Mirror RequestID if Authenticated, -1 if Failed
            byte[] buffer = stream.ToArray();

            clientStream.Write(buffer, 0, buffer.Length);
            clientStream.Flush();
        }

I am going to be dealing with other packet types as well that are formatted the same (int/int/int/str/str), but different values. I could probably create a packet class, but this is a bit outside my scope of knowledge for how to apply it to this scenario. If it makes any difference, this is the Protocol I am implementing.

http://developer.valvesoftware.com/wiki/Source_RCON_Protocol

© Stack Overflow or respective owner

Related posts about c#

Related posts about optimization