/// <summary> /// 根据域名获取IP地址 /// </summary> /// <param name="domain">域名</param> /// <returns>IP地址,失败返回null</returns> internal unsafe static IPAddress[] GetIPAddress(ref subArray <byte> domain) { try { fixed(byte *domainFixed = domain.UnsafeArray) { byte *domainStart = domainFixed + domain.StartIndex; unsafer.memory.ToLower(domainStart, domainStart + domain.Count); hashBytes key = domain; ipAddress value; Monitor.Enter(domainIpLock); try { value = domainIps.Get(key, default(ipAddress)); if (value.Ips != null && value.Timeout < date.NowSecond) { domainIps.Remove(key, out value); value.Ips = null; } } finally { Monitor.Exit(domainIpLock); } if (value.Ips == null) { if (value.Domain == null) { value.Domain = String.UnsafeDeSerialize(domainStart, -domain.Count); } IPAddress ip; if (IPAddress.TryParse(value.Domain, out ip)) { value.Timeout = DateTime.MaxValue; value.Domain = null; setDomainIp(key.Copy(), ref value); return(value.Ips = new IPAddress[] { ip }); } value.Ips = Dns.GetHostEntry(value.Domain).AddressList; if (value.Ips.Length != 0) { value.Timeout = date.NowSecond.AddTicks(domainIpTimeoutTicks); setDomainIp(key.Copy(), ref value); return(value.Ips); } } else { return(value.Ips); } } } catch (Exception error) { log.Default.Add(error, null, false); } return(null); }
/// <summary> /// 设置域名转换IP地址 /// </summary> /// <param name="key">域名</param> /// <param name="ipAddress">IP地址</param> private static void setDomainIp(hashBytes key, ref ipAddress ipAddress) { Monitor.Enter(domainIpLock); try { domainIps.Set(key, ipAddress); if (domainIps.Count == config.http.Default.IpAddressCacheCount) { domainIps.UnsafePopValue(); } } finally { Monitor.Exit(domainIpLock); } }
/// <summary> /// 接受数据 /// </summary> private unsafe void receive() { EndPoint endPoint = null; byte[] data = new byte[MaxPacketSize]; fixed(byte *dataFixed = data) { while (socket != null) { try { endPoint = anyIp; int count = socket.ReceiveFrom(data, 0, MaxPacketSize, SocketFlags.None, ref endPoint); if (count > 0) { ipPort oldPort, ipPort = (IPEndPoint)endPoint; byte[] name = new byte[count]; Buffer.BlockCopy(data, 0, name, 0, count); hashBytes nameKey = name; if (names.TryGetValue(nameKey, out oldPort)) { if (ipPort.Equals(oldPort)) { ports.RefreshTimeout(oldPort); } else { ports.Remove(oldPort); ports[ipPort] = nameKey; names[nameKey] = ipPort; } } else { ports[ipPort] = nameKey; names[nameKey] = ipPort; } } } catch (Exception error) { Console.WriteLine(error.ToString()); Thread.Sleep(1); } } } }
/// <summary> /// /// </summary> /// <param name="ipPort"></param> /// <param name="name"></param> private void remove(ipPort ipPort, hashBytes name) { names.Remove(name); }