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; } }
public TCPRelayTest() { _sut = new TCPRelay(null, null) { TCPHandlerFactory = (controller, configuration, relay, socket) => _tcpHanlderMoq.Object }; }
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(); }
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); }
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); }
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); }
public HttpHandler(ShadowsocksController controller, Configuration config, TCPRelay tcprelay, Socket socket) : base(controller, config, tcprelay, socket) { _localSocket = new WrappedSocket(socket); }
public TCPHandler NewHandler(ShadowsocksController controller, Configuration config, TCPRelay tcprelay, Socket socket) { return new HttpHandler(controller, config, tcprelay, socket); }
public Socks5Handler(ShadowsocksController controller, Configuration config, TCPRelay tcprelay, Socket socket) : base(controller, config, tcprelay, socket, false) { }
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)); }
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; } }
private static void AssertRelayRemoveHandler(TCPRelay relay, TCPHandler sut) { Assert.False(relay.Handlers.Contains(sut)); }