コード例 #1
0
        public static async Task <ConnectResult> Connect(IAdapter adapter, AddrPort dest, int timeoutSeconds)
        {
            Socket socket;

            try {
                socket = await NaiveUtils.ConnectTcpAsync(dest, timeoutSeconds * 1000);
            } catch (Exception e) {
                return(new ConnectResult(adapter, ConnectResultEnum.Failed)
                {
                    FailedReason = e.Message,
                    Exception = e
                });
            }
            return(new ConnectResult(adapter, MyStream.FromSocket(socket, adapter.GetAdapter().socket_impl)));
        }
コード例 #2
0
ファイル: DnsInAdapter.cs プロジェクト: smeoow/Naive
        private async void UDPListen()
        {
            try {
                var anyEP  = new IPEndPoint(0, 0);
                var socket = new Socket(listen.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
                socket.Bind(listen);
                udpClient = MyStream.FromSocket(socket);
                while (true)
                {
                    var r = await udpClient.ReadFromAsyncR(64 * 1024, anyEP);

                    Task.Run(() => HandleUdpReceiveResult(r)).Forget();
                }
            } catch (Exception e) {
                Logger.exception(e, Logging.Level.Warning, "UDP listener stopped");
            } finally {
                udpClient?.Close();
                udpClient = null;
            }
        }
コード例 #3
0
ファイル: Socks5Client.cs プロジェクト: smeoow/Naive
        public async Task <SocketStream> ConnectAsync()
        {
            _socket = await NaiveUtils.ConnectTcpAsync(new AddrPort(_socksAddr, _socksPort), 0);

            var _ns = MyStream.FromSocket(_socket);

            var user = _username;
            var pass = _password ?? "";

            byte[] buffer =
                user == null
                ? new byte[] { SOCKS_VER, 1, NOAUTH }
                : new byte[] { SOCKS_VER, AUTH_METH_SUPPORT, NOAUTH, USER_PASS_AUTH };
            await _ns.WriteAsyncR(buffer);

            await _ns.ReadFullAsyncR(new BytesSegment(buffer, 0, 2));

            if (buffer[1] == NOAUTH)
            {
                // nothing to do.
            }
            else if (buffer[1] == USER_PASS_AUTH)
            {
                byte[] credentials = new byte[user.Length + pass.Length + 3];
                var    pos         = 0;
                credentials[pos++] = 1;
                credentials[pos++] = (byte)user.Length;
                pos += Encoding.ASCII.GetBytes(user, 0, user.Length, credentials, pos);
                credentials[pos++] = (byte)pass.Length;
                pos += Encoding.ASCII.GetBytes(pass, 0, pass.Length, credentials, pos);

                await _ns.WriteAsyncR(credentials);

                await _ns.ReadFullAsyncR(new BytesSegment(buffer, 0, 2));

                if (buffer[1] != SOCKS_CMD_SUCCSESS)
                {
                    throw new SocksRefuseException("Invalid username or password.");
                }
            }
            else
            {
                _socket.Close();
                throw new SocksAuthException();
            }

            byte addrType = GetAddressType();

            byte[] address = GetDestAddressBytes(addrType, _destAddr);
            byte[] port    = GetDestPortBytes(_destPort);
            buffer    = new byte[4 + port.Length + address.Length];
            buffer[0] = SOCKS_VER;
            buffer[1] = CMD_CONNECT;
            buffer[2] = 0x00; //reserved
            buffer[3] = addrType;
            address.CopyTo(buffer, 4);
            port.CopyTo(buffer, 4 + address.Length);
            await _ns.WriteAsyncR(buffer);

            buffer = new byte[256];
            await _ns.ReadFullAsyncR(new BytesSegment(buffer, 0, 4));

            if (buffer[1] != SOCKS_CMD_SUCCSESS)
            {
                throw new SocksRefuseException($"remote socks5 server returns {new BytesView(buffer, 0, 4)}");
            }
            switch (buffer[3])
            {
            case 1:
                await _ns.ReadFullAsyncR(new BytesSegment(buffer, 0, 4 + 2));

                break;

            case 3:
                await _ns.ReadFullAsyncR(new BytesSegment(buffer, 0, 1));

                await _ns.ReadFullAsyncR(new BytesSegment(buffer, 0, buffer[0]));

                break;

            case 4:
                await _ns.ReadFullAsyncR(new BytesSegment(buffer, 0, 16 + 2));

                break;

            default:
                throw new Exception("Not supported addr type: " + buffer[3]);
            }

            return(_ns);
        }
コード例 #4
0
 public IMyStream GetMyStreamFromSocket(Socket socket) => MyStream.FromSocket(socket, socket_impl);
コード例 #5
0
ファイル: UdpRelay.cs プロジェクト: smeoow/Naive
 static SocketStream CreateUdpSocket() => MyStream.FromSocket(new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp));