using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.IO; using System.Diagnostics; using Microsoft.Win32; namespace AHSoftware.CubeMon.Games.CubeEngineBase { public class Ping { IPEndPoint receiver; public IPEndPoint Receiver { get { return receiver; } set { receiver = value; } } public Ping() { } public Ping(IPEndPoint receiver) { Receiver = receiver; } public byte[] Send() { byte[] data = { 0x1 }; Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.IP); socket.Connect(receiver); socket.Send(data); socket.ReceiveTimeout = 2000; byte[] pong = new byte[256]; socket.Receive(pong); if(pong == null || pong.Length < 1 || pong[0] != data[0]) return null; return pong; } } public class EnetDecoder { protected Byte[] buf; protected int cursor = 0; protected bool endOfBuffer = false; protected virtual byte NextByte() { return buf[cursor++]; } public bool EndOfBuffer { get { return endOfBuffer; } } public EnetDecoder(Byte[] buf) { this.buf = buf; } public virtual int GetInt32() { if(endOfBuffer) return 0; if(cursor >= buf.Length) { endOfBuffer = true; return 0; } Byte b = NextByte(); if(b == 0x80) { if(cursor + 1 >= buf.Length) { endOfBuffer = true; return 0; } int value = NextByte(); return value | NextByte() << 8; } else if(b == 0x81) { if(cursor + 3 >= buf.Length) { endOfBuffer = true; return 0; } int value = NextByte(); value |= NextByte() << 8; value |= NextByte() << 16; return value | NextByte() << 24; } else return b; } public virtual string GetString() { if(endOfBuffer) return null; const int maxChars = 5000; List chars = new List(); do { byte b = (byte)GetInt32(); if(b == 0x00) break; chars.Add(b); } while(!endOfBuffer && chars.Count < maxChars); return Encoding.ASCII.GetString(chars.ToArray()); } } }