예제 #1
0
파일: Proxy.cs 프로젝트: TW2002/twxp
        public async Task StartAsync()
        {
            if (active == true)
            {
                return;
            }
            else
            {
                active = true;
            }

            if (tcpListener != null)
            {
                tcpListener.Start();
                return;
            }

            if (!string.IsNullOrEmpty(ListenAddress))
            {
                try
                {
                    // Set the porrt if specified in ProxyAddress.
                    if (ListenAddress.Contains(":"))
                    {
                        String[] s = ListenAddress.Split(':');
                        ListenAddress = s[0];
                        ListenPort    = int.Parse(s[1]);
                    }

                    // Resolve host binding from ProxyAddress
                    IPHostEntry ipHost = await Dns.GetHostEntryAsync(ListenAddress);

                    ListenIP = ipHost.AddressList[1];
                }
                catch { }
            }

            try
            {
                tcpListener = new TcpListener(ListenIP, ListenPort);
                tcpListener.Start();
            }
            catch (Exception e)
            {
                Console.WriteLine("\n \n*** Error *** Unable to open TCP listener. Socket returned error message:\n{0}", e.Message);
                //Environment.Exit(1);
            }

            await HandleConnectionsAsync(tcpListener);

            tcpListener.Stop();
        }
예제 #2
0
        public void Start()
        {
            if (OnClientRequestingConnection == null)
            {
                throw new ServerException("Client request handler not set");
            }
            if (running)
            {
                Logger.WriteLine("TCPServer: start requested, but server is already running", Logger.Severity.Warning);
                return;
            }
            Logger.WriteLine("TCPServer: starting", Logger.Severity.Debug);
            tcpListener = new TcpListener(ListenAddress, ListenPort);
            try {
                tcpListener.Start();
            } catch (SocketException exn) {
                string socketError = "socket error '" + exn.SocketErrorCode + "': " + exn.Message;
                Logger.WriteLine("TCPServer: failed to start server; " + socketError, Logger.Severity.Error);
                throw new ServerException(socketError);
            }
            var endPoint = (IPEndPoint)tcpListener.LocalEndpoint;

            actualPort     = (ushort)endPoint.Port;
            startedEvent   = new AutoResetEvent(false);
            listenerThread = new Thread(ListenerThread);
            listenerThread.Start();
            startedEvent.WaitOne(500);
            if (!running)
            {
                Logger.WriteLine("TCPServer: failed to start server, timed out waiting for TcpListener to start", Logger.Severity.Error);
                listenerThread.Abort();
                listenerThread.Join();
                tcpListener = null;
                throw new ServerException("Failed to start server, timed out waiting for TcpListener to start");
            }
            EventHandlerExtensions.Invoke(OnStarted, this);
            Logger.WriteLine("TCPServer: started successfully", Logger.Severity.Debug);
            if (ListenAddress.ToString() == "0.0.0.0")
            {
                Logger.WriteLine("TCPServer: listening on all local network interfaces", Logger.Severity.Debug);
            }
            else
            {
                Logger.WriteLine("TCPServer: listening on local address " + Address, Logger.Severity.Debug);
            }
            Logger.WriteLine("TCPServer: listening on port " + actualPort, Logger.Severity.Debug);
        }
예제 #3
0
        /// <summary>
        /// 根据配置的监听地址获取实际的地址
        /// </summary>
        /// <returns></returns>
        public string GetHostAddress()
        {
            if (!string.IsNullOrWhiteSpace(ListenAddress))
            {
                var separator = ListenAddress.IndexOf("/");
                if (separator > 0)
                {
                    var baseAddress = ListenAddress.Substring(0, separator);
                    if (int.TryParse(ListenAddress.Substring(separator + 1), out int maskBits))
                    {
                        return(GetHostAddress(baseAddress, maskBits));
                    }

                    return(baseAddress);
                }
            }

            return(ListenAddress);
        }