public void Start(Configuration config) { this._config = config; this._shareOverLAN = config.shareOverLan; if (CheckIfPortInUse(_config.localPort)) { throw new Exception(I18N.GetString("Port already in use")); } try { // Create a TCP/IP socket. _tcpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); // 设置为接收所有的socket数据包 _tcpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); _udpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); IPEndPoint localEndPoint = null; if (_shareOverLAN) { // 将绑定所有网络接口地址发出的请求,0.0.0.0 localEndPoint = new IPEndPoint(IPAddress.Any, _config.localPort); } else { // 将只绑定环回地址发出的请求 127.0.0.1 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. // 开始监听客户端socket请求 Console.WriteLine("Shadowsocks started"); _tcpSocket.BeginAccept( new AsyncCallback(AcceptCallback), _tcpSocket); // 开始接收数据(udp socket不需要连接确认,直接接收数据) UDPState udpState = new UDPState(); _udpSocket.BeginReceiveFrom(udpState.buffer, 0, udpState.buffer.Length, 0, ref udpState.remoteEndPoint, new AsyncCallback(RecvFromCallback), udpState); } catch (SocketException) { _tcpSocket.Close(); throw; } }
public void Start(Configuration config) { this._config = config; this._shareOverLAN = config.shareOverLan; if (CheckIfPortInUse(_config.localPort)) { throw new Exception(I18N.GetString("Port {0} already in use", _config.localPort)); } 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; localEndPoint = _shareOverLAN ? new IPEndPoint(IPAddress.Any, _config.localPort) : 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. Logging.Info($"Shadowsocks started ({UpdateChecker.Version})"); if (_config.isVerboseLogging) { Logging.Info(Encryption.EncryptorFactory.DumpRegisteredEncryptor()); } _tcpSocket.BeginAccept(new AsyncCallback(AcceptCallback), _tcpSocket); UDPState udpState = new UDPState(); udpState.socket = _udpSocket; _udpSocket.BeginReceiveFrom(udpState.buffer, 0, udpState.buffer.Length, 0, ref udpState.remoteEndPoint, new AsyncCallback(RecvFromCallback), udpState); } catch (SocketException) { _tcpSocket.Close(); throw; } }
public void RecvFromCallback(IAsyncResult ar) { UDPState state = (UDPState)ar.AsyncState; var socket = state.socket; try { int bytesRead = socket.EndReceiveFrom(ar, ref state.remoteEndPoint); foreach (IService service in _services) { if (service.Handle(state.buffer, bytesRead, socket, state)) { break; } } } catch (ObjectDisposedException) { } catch (Exception ex) { Logging.Debug(ex); } finally { try { socket.BeginReceiveFrom(state.buffer, 0, state.buffer.Length, 0, ref state.remoteEndPoint, new AsyncCallback(RecvFromCallback), state); } catch (ObjectDisposedException) { // do nothing } catch (Exception) { } } }