Example #1
0
        public void BeginConnectDest(EndPoint destEndPoint, AsyncCallback callback, object state)
        {
            DestEndPoint = destEndPoint;
            string request = string.Format(HTTP_CONNECT_TEMPLATE, destEndPoint);
            var    b       = Encoding.UTF8.GetBytes(request);
            var    st      = new HttpState();

            st.Callback   = callback;
            st.AsyncState = state;

            _remote.BeginSend(b, 0, b.Length, SocketFlags.None, HttpRequestSendCallback, st);
        }
Example #2
0
 private void HandshakeReceive()
 {
     if (_closed)
     {
         return;
     }
     try
     {
         _remote.BeginSend(_firstPacket, 0, _firstPacketLength, 0, StartPipe, null);
     }
     catch (Exception e)
     {
         Logging.LogUsefulException(e);
         Close();
     }
 }
        public void BeginConnectDest(EndPoint destEndPoint, AsyncCallback callback, object state, NetworkCredential auth = null)
        {
            DestEndPoint = destEndPoint;
            String authInfo = "";

            if (auth != null)
            {
                string authKey = Convert.ToBase64String(Encoding.UTF8.GetBytes(auth.UserName + ":" + auth.Password));
                authInfo = string.Format(PROXY_AUTH_TEMPLATE, authKey);
            }
            string request = string.Format(HTTP_CONNECT_TEMPLATE, destEndPoint, authInfo);

            var b = Encoding.UTF8.GetBytes(request);

            var st = new HttpState();

            st.Callback   = callback;
            st.AsyncState = state;

            _remote.BeginSend(b, 0, b.Length, 0, HttpRequestSendCallback, st);
        }
Example #4
0
        public void BeginConnectDest(EndPoint destEndPoint, AsyncCallback callback, object state)
        {
            DestEndPoint = destEndPoint;

            int len = Socks5Util.HeaderAddrLength(destEndPoint);

            byte[] request = new byte[len + 3];
            Socks5Util.FillHeaderAddr(request, 3, destEndPoint);

            // 构造request包剩余部分
            request[0] = 5;
            request[1] = 1;
            request[2] = 0;

            var st = new Socks5State();

            st.Callback   = callback;
            st.AsyncState = state;

            _remote.BeginSend(request, 0, request.Length, 0, Socks5RequestSendCallback, st);
        }
        private void ConnectCallback(IAsyncResult ar)
        {
            var state = (Socks5State)ar.AsyncState;

            try
            {
                _remote.EndConnect(ar);

                _remote.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true);

                byte[] handshake = { 5, 1, 0 };
                _remote.BeginSend(handshake, 0, handshake.Length, 0, Socks5HandshakeSendCallback, state);
            }
            catch (Exception ex)
            {
                state.ex = ex;
                state.Callback?.Invoke(new FakeAsyncResult(ar, state));
            }
        }
 public void BeginSend(byte[] buffer, int offset, int size, SocketFlags socketFlags, AsyncCallback callback,
                       object state)
 {
     _remote.BeginSend(buffer, offset, size, socketFlags, callback, state);
 }
        public void BeginConnectDest(EndPoint destEndPoint, AsyncCallback callback, object state)
        {
            DestEndPoint = destEndPoint;

            byte[] request = null;
            byte   atyp    = 0;
            int    port;

            var dep = destEndPoint as DnsEndPoint;

            if (dep != null)
            {
                // is a domain name, we will leave it to server

                atyp = 3; // DOMAINNAME
                var enc           = Encoding.UTF8;
                var hostByteCount = enc.GetByteCount(dep.Host);

                request    = new byte[4 + 1 /*length byte*/ + hostByteCount + 2];
                request[4] = (byte)hostByteCount;
                enc.GetBytes(dep.Host, 0, dep.Host.Length, request, 5);

                port = dep.Port;
            }
            else
            {
                switch (DestEndPoint.AddressFamily)
                {
                case AddressFamily.InterNetwork:
                    request = new byte[4 + 4 + 2];
                    atyp    = 1;  // IP V4 address
                    break;

                case AddressFamily.InterNetworkV6:
                    request = new byte[4 + 16 + 2];
                    atyp    = 4;  // IP V6 address
                    break;

                default:
                    throw new Exception(I18N.GetString("Proxy request failed"));
                }
                port = ((IPEndPoint)DestEndPoint).Port;
                var addr = ((IPEndPoint)DestEndPoint).Address.GetAddressBytes();
                Array.Copy(addr, 0, request, 4, request.Length - 4 - 2);
            }

            // 构造request包剩余部分
            request[0] = 5;
            request[1] = 1;
            request[2] = 0;
            request[3] = atyp;
            request[request.Length - 2] = (byte)((port >> 8) & 0xff);
            request[request.Length - 1] = (byte)(port & 0xff);

            var st = new Socks5State();

            st.Callback   = callback;
            st.AsyncState = state;

            _remote?.BeginSend(request, 0, request.Length, 0, Socks5RequestSendCallback, st);
        }
        private void SendConnectResponse(AsyncSession session)
        {
            var len = Encoding.UTF8.GetBytes(HTTP_CONNECT_200, 0, HTTP_CONNECT_200.Length, RemoteRecvBuffer, 0);

            _localSocket.BeginSend(RemoteRecvBuffer, 0, len, SocketFlags.None, Http200SendCallback, session);
        }