コード例 #1
0
ファイル: httpClient.cs プロジェクト: iLanceS/fastCSharp
        /// <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);
        }
コード例 #2
0
ファイル: httpClient.cs プロジェクト: iLanceS/fastCSharp
 /// <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); }
 }
コード例 #3
0
        /// <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);
                    }
                }
            }
        }
コード例 #4
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="ipPort"></param>
 /// <param name="name"></param>
 private void remove(ipPort ipPort, hashBytes name)
 {
     names.Remove(name);
 }