Пример #1
0
        public virtual ulong Add(IPAddress sourceIP)
        {
            if (sourceIP == null)
            {
                throw new ArgumentNullException("sourceIP");
            }
            ulong sessionKey;
            IPKey key;

            lock (records)
            {
                do
                {
                    random.GetBytes(rbuf);
                    sessionKey = 0;
                    for (int i = 0; i < rbuf.Length; i++)
                    {
                        sessionKey <<= 8;
                        sessionKey  += rbuf[i];
                    }
                    key = new IPKey(sourceIP, sessionKey);
                } while (records.Contains(key));
                records.Add(key);
            }
            return(sessionKey);
        }
Пример #2
0
        public virtual void Run()
        {
            if (running)
            {
                throw new InvalidOperationException("Server is running on another thread");
            }
            var ack = new byte[0];

            while (running)
            {
                remoteEndPoint.Address = IPAddress.IPv6Any;
                remoteEndPoint.Port    = 0;
                EndPoint endpoint = remoteEndPoint;
                int      len      = socket.ReceiveFrom(buffer, ref endpoint);
                socket.SendTo(ack, endpoint);
                if (len != sizeof(ulong))
                {
                    continue;
                }
                var   ipep       = (IPEndPoint)endpoint;
                ulong sessionKey = 0;
                for (int i = 0; i < sizeof(ulong); i++)
                {
                    sessionKey <<= 8;
                    sessionKey  += buffer[i];
                }
                var  key = new IPKey(ipep.Address, sessionKey);
                bool removed;
                lock (records)
                    removed = records.Remove(key);
                if (removed)
                {
                    lock (sourcePorts)
                        sourcePorts.Add(key, (ushort)ipep.Port);
                }
            }
        }