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))); }
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; } }
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); }
public IMyStream GetMyStreamFromSocket(Socket socket) => MyStream.FromSocket(socket, socket_impl);
static SocketStream CreateUdpSocket() => MyStream.FromSocket(new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp));