Exemplo n.º 1
0
        public void Start(Configuration config)
        {
            this._config = config;

            if (CheckIfPortInUse(_config.localPort))
            {
                throw new SSPortAlreadyInUseException();
            }

            this._shareOverLAN = config.shareOverLan;

            var tcpservice = new TCPRelay(_config);

            tcpservice.OnClose += this.Broken;

            var udpservice = new UDPRelay(_config);

            udpservice.OnClose += this.Broken;

            AddService(tcpservice);
            AddService(udpservice);

            try
            {
                // Create a TCP/IP socket.
                _tcpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                _udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                _tcpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                _udpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                IPEndPoint localEndPoint = null;
                if (_shareOverLAN)
                {
                    localEndPoint = new IPEndPoint(IPAddress.Any, _config.localPort);
                }
                else
                {
                    localEndPoint = new IPEndPoint(IPAddress.Loopback, _config.localPort);
                }

                // Bind the socket to the local endpoint and listen for incoming connections.
                _tcpSocket.Bind(localEndPoint);
                _udpSocket.Bind(localEndPoint);
                _tcpSocket.Listen(1024);


                // Start an asynchronous socket to listen for connections.
                Trace.WriteLine("Shadowsocks started");
                _tcpSocket.BeginAccept(
                    new AsyncCallback(AcceptCallback),
                    _tcpSocket);
                UDPState udpState = new UDPState();
                _udpSocket.BeginReceiveFrom(udpState.buffer, 0, udpState.buffer.Length, 0, ref udpState.remoteEndPoint, new AsyncCallback(RecvFromCallback), udpState);
            }
            catch (SocketException)
            {
                _tcpSocket.Close();
                this.Broken();
                throw;
            }
        }
Exemplo n.º 2
0
 public TCPRelayTest()
 {
     _sut = new TCPRelay(null, null)
     {
         TCPHandlerFactory = (controller, configuration, relay, socket) => _tcpHanlderMoq.Object
     };
 }
Exemplo n.º 3
0
        public void Start(string listenSocks, string serverAddress, int serverPort, string method, string password, string?plugin, string?pluginOpts, string?pluginArgs)
        {
            var localEP = IPEndPoint.Parse(listenSocks);
            var server  = new Server()
            {
                Host       = serverAddress,
                Port       = serverPort,
                Method     = method,
                Password   = password,
                Plugin     = plugin,
                PluginOpts = pluginOpts,
            };

            if (!string.IsNullOrEmpty(plugin) && !string.IsNullOrEmpty(pluginArgs))
            {
                var processStartInfo = new ProcessStartInfo(plugin, pluginArgs);
                server.PluginArgs = processStartInfo.ArgumentList.ToList();
            }

            var tcpRelay = new TCPRelay(server);

            _tcpListener = new TCPListener(localEP, new List <IStreamService>()
            {
                tcpRelay,
            });
            _tcpListener.Start();

            var udpRelay = new UDPRelay(server);

            _udpListener = new UDPListener(localEP, new List <IDatagramService>()
            {
                udpRelay,
            });
            _udpListener.Start();
        }
Exemplo n.º 4
0
 private static void AssertResourcesProperlyCleaned(TCPHandler sut, TCPRelay relay, Mock <SocketProxy> socketMock, Mock <IProxy> remoteMock,
                                                    Mock <IEncryptor> encryptorMock)
 {
     Assert.True(sut.Closed);
     AssertRelayRemoveHandler(relay, sut);
     VerifySocketDisposed(socketMock);
     VerifyRemoteDisposed(remoteMock);
     VerifyEncryptorDisposed(encryptorMock);
 }
Exemplo n.º 5
0
        public void close_should_ignore_closed_handler()
        {
            var socketMock = new Mock <SocketProxy>(MockBehavior.Loose, (Socket)null);
            var config     = CreateMockConfiguration();
            var relay      = new TCPRelay(null, null);
            var sut        = new TCPHandler(null, config, relay, socketMock.Object);

            sut.Closed = true;
            sut.Close();

            VerifyHandlerDoNotCloseSocket(socketMock);
        }
Exemplo n.º 6
0
        public void handle_should_only_close_timeout_handlers()
        {
            _tcpHanlderMoq = CreateTimeoutHandlerMock();
            _sut           = new TCPRelay(null, null, DefinitelyTimeoutSweepTime());
            var newCreatedTcpHandlerMock = new Mock <ITCPHandler>();

            newCreatedTcpHandlerMock.Setup(_ => _.Start(FirstPacket, FirstPacket.Length));
            newCreatedTcpHandlerMock.Setup(_ => _.LastActivity).Returns(DateTime.Now);
            _sut.TCPHandlerFactory = (controller, configuration, arg3, arg4) => newCreatedTcpHandlerMock.Object;
            _sut.Handlers.Add(_tcpHanlderMoq.Object);

            _sut.Handle(FirstPacket, FirstPacket.Length, _socketMoq.Object, null);

            VerifyProperlyHandleTimeoutHandlers(_tcpHanlderMoq, newCreatedTcpHandlerMock);
        }
Exemplo n.º 7
0
 public HttpHandler(ShadowsocksController controller, Configuration config, TCPRelay tcprelay, Socket socket)
     : base(controller, config, tcprelay, socket)
 {
     _localSocket = new WrappedSocket(socket);
 }
Exemplo n.º 8
0
 public TCPHandler NewHandler(ShadowsocksController controller, Configuration config, TCPRelay tcprelay, Socket socket)
 {
     return new HttpHandler(controller, config, tcprelay, socket);
 }
Exemplo n.º 9
0
 public Socks5Handler(ShadowsocksController controller, Configuration config, TCPRelay tcprelay, Socket socket)
     : base(controller, config, tcprelay, socket, false)
 {
 }
Exemplo n.º 10
0
 private static void VerifyHandlerProperlyStarted(TCPRelay relay, Mock <ITCPHandler> tcpHanlderMoq)
 {
     Assert.True(relay.Handlers.Contains(tcpHanlderMoq.Object));
     tcpHanlderMoq.Verify(_ => _.Start(FirstPacket, FirstPacket.Length), Times.Exactly(1));
 }
Exemplo n.º 11
0
        public void Start(Configuration config)
        {
            this._config = config;

            if (CheckIfPortInUse(_config.localPort))
                throw new SSPortAlreadyInUseException();

            this._shareOverLAN = config.shareOverLan;

            var tcpservice = new TCPRelay(_config);
            tcpservice.OnClose += this.Broken;

            var udpservice = new UDPRelay(_config);
            udpservice.OnClose += this.Broken;

            AddService(tcpservice);
            AddService(udpservice);

            try
            {
                // Create a TCP/IP socket.
                _tcpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                _udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                _tcpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                _udpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                IPEndPoint localEndPoint = null;
                if (_shareOverLAN)
                {
                    localEndPoint = new IPEndPoint(IPAddress.Any, _config.localPort);
                }
                else
                {
                    localEndPoint = new IPEndPoint(IPAddress.Loopback, _config.localPort);
                }

                // Bind the socket to the local endpoint and listen for incoming connections.
                _tcpSocket.Bind(localEndPoint);
                _udpSocket.Bind(localEndPoint);
                _tcpSocket.Listen(1024);

                // Start an asynchronous socket to listen for connections.
                Trace.WriteLine("Shadowsocks started");
                _tcpSocket.BeginAccept(
                    new AsyncCallback(AcceptCallback),
                    _tcpSocket);
                UDPState udpState = new UDPState();
                _udpSocket.BeginReceiveFrom(udpState.buffer, 0, udpState.buffer.Length, 0, ref udpState.remoteEndPoint, new AsyncCallback(RecvFromCallback), udpState);
            }
            catch (SocketException)
            {
                _tcpSocket.Close();
                this.Broken();
                throw;
            }
        }
Exemplo n.º 12
0
 private static void AssertRelayRemoveHandler(TCPRelay relay, TCPHandler sut)
 {
     Assert.False(relay.Handlers.Contains(sut));
 }