All pastes #485026 Raw Edit

cube ping

public text v1 · immutable
·published 2007-05-12 20:40 UTC
rendered paste body
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<byte> chars = new List<byte>();
            do
            {
                byte b = (byte)GetInt32();
                if(b == 0x00) break;
                chars.Add(b);
            } while(!endOfBuffer && chars.Count < maxChars);


            return Encoding.ASCII.GetString(chars.ToArray());
        }
    }
}