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