Exemplo n.º 1
0
 void xrun()
 {
     while (true)
     {
         IPEndPoint clientIP = new IPEndPoint(IPAddress.Any, 20700);
         byte[]     data     = udp.Receive(ref clientIP);
         string     str      = Encoding.ASCII.GetString(data);
         Log2.Data(str);
         udp.Send(data, data.Length, clientIP);
     }
 }
 void xrun()
 {
     while (true)
     {
         IPEndPoint   clientIP = new IPEndPoint(IPAddress.Any, 00000);
         byte[]       data     = udp.Receive(ref clientIP);
         MemoryStream memsr    = new MemoryStream(data);
         Log2.Info(Encoding.ASCII.GetString(data));
         BinaryReader reader = new BinaryReader(memsr);
         if (data.Length > 4)
         {
             reader.ReadInt32(); // Clear the header...
             string type = Encoding.ASCII.GetString(reader.ReadBytes(data.Length - 4));
             if (type.Contains("heartbeat"))
             {
                 if (!type.Contains("flatline"))  //We still on...
                 {
                     int          a    = SendChallenge(clientIP, udp);
                     MemoryStream gsts = new MemoryStream();
                     BinaryWriter w    = new BinaryWriter(gsts);
                     w.Write(new byte[] { 0xFF, 0xFF, 0xFF, 0xFF });
                     w.Write("getstatus " + a.ToString());
                     w.Flush();
                     byte[] bdata = gsts.ToArray();
                     udp.BeginSend(bdata, bdata.Length, clientIP, new AsyncCallback(Done), "GT-STS");
                 }
                 else
                 {
                     var cs = from cl in OnlineServers where cl.IP.ToString() == clientIP.ToString() select cl;
                     if (cs.Count() > 0)
                     {
                         Log2.Info("Client [" + cs.First().Configuration["sv_hostname"] + "] has been disconnected!");
                         OnlineServers.Remove(cs.First());  // Server removed!
                     }
                 }
             }
             if (type.Contains("statusResponse"))
             {
                 var cs = from cl in OnlineServers where cl.IP.ToString() == clientIP.ToString() select cl;
                 if (cs.Count() > 0)
                 {
                     int index = OnlineServers.IndexOf(cs.First());
                     OnlineServers[index] = new DedicatedClient(type, clientIP);
                     Log2.Info("Client [" + OnlineServers[index].Configuration["sv_hostname"] + "] has been updated.");
                 }
                 else
                 {
                     DedicatedClient dc = new DedicatedClient(type, clientIP);
                     OnlineServers.Add(dc);
                     Log2.Info("Connected client [" + dc.Configuration["sv_hostname"] + "].");
                 }
             }
             if (type.Contains("challengeResponse"))  // Do we really wanna mess up with this ?
             {
                 /*long chng = long.Parse(type.Split(' ')[1]);
                  * MemoryStream memsr2 = new MemoryStream();
                  * BinaryWriter writer = new BinaryWriter(memsr2);
                  * writer.Write(new byte[] { 0x00, 0xFF, 0xFF, 0xFF, 0xFF });  //Header
                  * writer.Write("getstatus");
                  * writer.Write(new byte[] { 0x02, 0x2D });
                  * writer.Write(chng);
                  * writer.Write(0x00);
                  * writer.Flush();
                  * byte[] fres = memsr2.ToArray();
                  * memsr2.Dispose(); //Stack saver?
                  * udp.BeginSend(fres, fres.Length, clientIP, new AsyncCallback(Done), "STS-REQ-" + chng.ToString());  // done with the chanllage shit!*/
             }
             if (type.Contains("getservers"))
             {
                 // Protocol Check
                 // 6 - Call of Duty 4
                 // 118 - Call of Duty 2
                 if (type.Split(' ')[1] == "6")
                 {
                     MemoryStream back = new MemoryStream();
                     BinaryWriter wr   = new BinaryWriter(back);
                     wr.Write(new byte[] { 0xFF, 0xFF, 0xFF, 0xFF });
                     wr.Write(new byte[] { 0x67, 0x65, 0x74, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65 });
                     //wr.Write(new byte[] { 0x0A, 0x00 });  // Ermm.. magic number ?
                     wr.Write((byte)0x5C);
                     if (OnlineServers.Count > 0)
                     {
                         foreach (var cl in OnlineServers)
                         {
                             byte[] ip = cl.IP.Address.GetAddressBytes();
                             wr.Write(ip);
                             wr.Write((short)cl.IP.Port);
                         }
                     }
                     wr.Write((byte)0x5C);
                     wr.Write(new byte[] { 0x45, 0x4f, 0x66 });
                     wr.Flush();
                     byte[] servs = back.ToArray();
                     udp.BeginSend(servs, servs.Length, clientIP, new AsyncCallback(Done), "GT-SERVERS");
                 }
             }
             if (type.Contains("getIpAuthorize"))
             {
                 string[]     parts  = type.Split(' ');
                 MemoryStream memsr2 = new MemoryStream();
                 BinaryWriter writer = new BinaryWriter(memsr2);
                 writer.Write(new byte[] { 0xFF, 0xFF, 0xFF, 0xFF });
                 writer.Write("ipAuthorize ");
                 writer.Write(parts[1] + " ");
                 writer.Write("accept KEY_IS_GOOD");
                 writer.Flush();
                 byte[] final = memsr2.ToArray();
                 udp.BeginSend(final, final.Length, clientIP, new AsyncCallback(Done), "IP-ACCEPT");
             }
         }
         else
         {
             Log2.Data("Unkown packet?");
         }
     }
 }