private int IsHandle(byte[] firstPacket, int length)
        {
            if (length >= 7 && _config.ProxyRuleMode != ProxyRuleMode.Disable)
            {
                IPAddress ipAddress = null;
                if (firstPacket[0] == 1)
                {
                    var addr = new byte[4];
                    Array.Copy(firstPacket, 1, addr, 0, addr.Length);
                    ipAddress = new IPAddress(addr);
                }
                else if (firstPacket[0] == 3)
                {
                    int len  = firstPacket[1];
                    var addr = new byte[len];
                    if (length >= len + 2)
                    {
                        Array.Copy(firstPacket, 2, addr, 0, addr.Length);
                        var host = Encoding.UTF8.GetString(firstPacket, 2, len);
                        if (IPAddress.TryParse(host, out ipAddress))
                        {
                            //pass
                        }
                        else
                        {
                            if ((_config.ProxyRuleMode == ProxyRuleMode.BypassLanAndChina || _config.ProxyRuleMode == ProxyRuleMode.BypassLanAndNotChina) && _IPRange != null || _config.ProxyRuleMode == ProxyRuleMode.UserCustom)
                            {
                                if (!IPAddress.TryParse(host, out ipAddress))
                                {
                                    if (_config.ProxyRuleMode == ProxyRuleMode.UserCustom)
                                    {
                                        if (HostMap.GetHost(host, out var host_addr))
                                        {
                                            if (!string.IsNullOrEmpty(host_addr))
                                            {
                                                var lower_host_addr = host_addr.ToLower();
                                                if (lower_host_addr.StartsWith("reject") ||
                                                    lower_host_addr.StartsWith("direct")
                                                    )
                                                {
                                                    return(CONNECT_DIRECT);
                                                }

                                                if (lower_host_addr.StartsWith("localproxy"))
                                                {
                                                    return(CONNECT_LOCALPROXY);
                                                }

                                                if (lower_host_addr.StartsWith("remoteproxy"))
                                                {
                                                    return(CONNECT_REMOTEPROXY);
                                                }

                                                if (lower_host_addr.IndexOf('.') >= 0 || lower_host_addr.IndexOf(':') >= 0)
                                                {
                                                    if (!IPAddress.TryParse(lower_host_addr, out ipAddress))
                                                    {
                                                        //
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    if (ipAddress == null)
                                    {
                                        ipAddress = DnsUtil.DnsBuffer.Get(host);
                                    }
                                }
                                if (ipAddress == null)
                                {
                                    ipAddress = DnsUtil.QueryDns(host);
                                    if (ipAddress != null)
                                    {
                                        DnsUtil.DnsBuffer.Set(host, new IPAddress(ipAddress.GetAddressBytes()));
                                        if (host.IndexOf('.') >= 0 && IPSubnet.IsLan(ipAddress))
                                        {
                                            // assume that it is pollution if return LAN address
                                            return(CONNECT_REMOTEPROXY);
                                        }
                                    }
                                    else
                                    {
                                        Logging.Log(LogLevel.Debug, "DNS query fail: " + host);
                                    }
                                }
                            }
                        }
                    }
                }
                else if (firstPacket[0] == 4)
                {
                    var addr = new byte[16];
                    Array.Copy(firstPacket, 1, addr, 0, addr.Length);
                    ipAddress = new IPAddress(addr);
                }
                if (ipAddress != null)
                {
                    if (_config.ProxyRuleMode == ProxyRuleMode.UserCustom)
                    {
                        if (HostMap.GetIP(ipAddress, out var host_addr))
                        {
                            var lower_host_addr = host_addr.ToLower();
                            if (lower_host_addr.StartsWith("reject") ||
                                lower_host_addr.StartsWith("direct")
                                )
                            {
                                return(CONNECT_DIRECT);
                            }

                            if (lower_host_addr.StartsWith("localproxy"))
                            {
                                return(CONNECT_LOCALPROXY);
                            }

                            if (lower_host_addr.StartsWith("remoteproxy"))
                            {
                                return(CONNECT_REMOTEPROXY);
                            }
                        }
                    }
                    else
                    {
                        if (IPSubnet.IsLan(ipAddress))
                        {
                            return(CONNECT_DIRECT);
                        }
                        if ((_config.ProxyRuleMode == ProxyRuleMode.BypassLanAndChina || _config.ProxyRuleMode == ProxyRuleMode.BypassLanAndNotChina) && _IPRange != null &&
                            ipAddress.AddressFamily == AddressFamily.InterNetwork
                            )
                        {
                            if (_IPRange.IsInIPRange(ipAddress))
                            {
                                return(CONNECT_LOCALPROXY);
                            }
                            DnsUtil.DnsBuffer.Sweep();
                        }
                    }
                }
            }
            return(CONNECT_REMOTEPROXY);
        }
        private void AcceptCallback(IAsyncResult ar)
        {
            if (_stop)
            {
                return;
            }
            var listener = (Socket)ar.AsyncState;

            try
            {
                var conn = listener.EndAccept(ar);

                var localPort = ((IPEndPoint)conn.LocalEndPoint).Port;

                if ((_authUser ?? string.Empty).Length == 0 && !IPSubnet.IsLan(conn) &&
                    !(_config.GetPortMapCache().ContainsKey(localPort) ||
                      _config.GetPortMapCache()[localPort].type == PortMapType.Forward))
                {
                    conn.Shutdown(SocketShutdown.Both);
                    conn.Close();
                }
                else
                {
                    var      buf   = new byte[4096];
                    object[] state =
                    {
                        conn,
                        buf
                    };

                    if (!_config.GetPortMapCache().ContainsKey(localPort) || _config.GetPortMapCache()[localPort].type != PortMapType.Forward)
                    {
                        conn.BeginReceive(buf, 0, buf.Length, 0, ReceiveCallback, state);
                    }
                    else
                    {
                        if (_services.Any(service => service.Handle(buf, 0, conn)))
                        {
                            return;
                        }
                        // no service found for this
                        // shouldn't happen
                        conn.Shutdown(SocketShutdown.Both);
                        conn.Close();
                    }
                }
            }
            catch (ObjectDisposedException)
            {
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
            finally
            {
                try
                {
                    listener.BeginAccept(AcceptCallback, listener);
                }
                catch (ObjectDisposedException)
                {
                    // do nothing
                }
                catch (Exception e)
                {
                    Logging.LogUsefulException(e);
                }
            }
        }