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); }
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); } } }