예제 #1
0
        public SocketConnector AddConnector(string name, IPEndPoint remoteEndPoint, ProxyInfo proxyData, EncryptType encryptType, CompressionType compressionType, ICryptoService cryptoService, int reconnectAttempts, int reconnectAttemptInterval, IPEndPoint localEndPoint)
        {
            SocketConnector result = null;

            if (!Disposed)
            {
                result = new SocketConnector(this, name, remoteEndPoint, proxyData, encryptType, compressionType, cryptoService, reconnectAttempts, reconnectAttemptInterval, localEndPoint);
                AddCreator(result);
            }

            return(result);
        }
        /// <summary>
        /// Base SocketConnector creator.
        /// </summary>
        /// <param name="host">
        /// Host.
        /// </param>
        /// <param name="remoteEndPoint">
        /// The remote endpoint to connect.
        /// </param>
        /// <param name="encryptType">
        /// Encrypt type.
        /// </param>
        /// <param name="compressionType">
        /// Compression type.
        /// </param>
        /// <param name="cryptoService">
        /// CryptoService. if null, will not be used.
        /// </param>
        /// <param name="localEndPoint">
        /// Local endpoint. if null, will be any address/port.
        /// </param>
        public SocketConnector(BaseSocketConnectionHost host, string name, IPEndPoint remoteEndPoint, ProxyInfo proxyData, EncryptType encryptType, CompressionType compressionType, ICryptoService cryptoService, int reconnectAttempts, int reconnectAttemptInterval, IPEndPoint localEndPoint)
            : base(host, name, localEndPoint, encryptType, compressionType, cryptoService)
        {
            FReconnectTimer = new Timer(new TimerCallback(ReconnectConnectionTimerCallBack));
            FRemoteEndPoint = remoteEndPoint;

            FReconnectAttempts        = reconnectAttempts;
            FReconnectAttemptInterval = reconnectAttemptInterval;

            FReconnectAttempted = 0;

            FProxyInfo = proxyData;
        }
        protected override void Free(bool canAccessFinalizable)
        {
            if (FReconnectTimer != null)
            {
                FReconnectTimer.Dispose();
                FReconnectTimer = null;
            }

            if (FSocket != null)
            {
                FSocket.Close();
                FSocket = null;
            }

            FRemoteEndPoint = null;
            FProxyInfo      = null;

            base.Free(canAccessFinalizable);
        }
        public SocketClientSync(IPEndPoint host)
        {
            FReceivedEvent   = new AutoResetEvent(false);
            FExceptionEvent  = new AutoResetEvent(false);
            FSentEvent       = new AutoResetEvent(false);
            FConnectEvent    = new AutoResetEvent(false);
            FDisconnectEvent = new ManualResetEvent(false);

            FReceivedQueue = new Queue <string>();

            FConnectTimeout = 10000;
            FSentTimeout    = 10000;

            FConnectedSync = new object();
            FConnected     = false;

            FSocketClientEvents = new SocketClientSyncSocketService(this);
            FCryptClientEvents  = new SocketClientSyncCryptService(this);

            FLocalEndPoint  = null;
            FRemoteEndPoint = host;

            //----- Message Types!
            FEncryptType     = EncryptType.etNone;
            FCompressionType = CompressionType.ctNone;
            FDelimiterType   = DelimiterType.dtNone;

            //----- Proxy!
            FProxyInfo = null;

            //----- System.Net.Sockets.Socket delimiter and buffer size!
            FDelimiter = null;

            FMessageBufferSize = 4096;
            FSocketBufferSize  = 2048;
        }
예제 #5
0
        internal static byte[] GetProxyRequestData(ProxyInfo proxyInfo, IPEndPoint remoteEndPoint)
        {
            byte[] result = null;

            switch (proxyInfo.ProxyType)
            {
            case ProxyType.ptHTTP:

                if (proxyInfo.ProxyCredential == null)
                {
                    result = Encoding.GetEncoding(1252).GetBytes(String.Format("CONNECT {0}:{1} HTTP/1.1\r\nnHost: {0}:{1}\r\n\r\n", remoteEndPoint.Address, remoteEndPoint.Port));
                }
                else
                {
                    string base64Encoding = Convert.ToBase64String(Encoding.GetEncoding(1252).GetBytes(proxyInfo.ProxyCredential.UserName + ":" + proxyInfo.ProxyCredential.Password));
                    result = Encoding.GetEncoding(1252).GetBytes(String.Format("CONNECT {0}:{1} HTTP/1.1\r\nHost: {0}:{1}\r\nAuthorization: Basic {2}\r\nProxy-Authorization: Basic {2}\r\n\r\n", remoteEndPoint.Address, remoteEndPoint.Port, base64Encoding));
                }

                break;

            case ProxyType.ptSOCKS4:
            case ProxyType.ptSOCKS4a:

                if (proxyInfo.ProxyType == ProxyType.ptSOCKS4)
                {
                    if (proxyInfo.ProxyCredential == null)
                    {
                        result = new byte[8 + 1];
                    }
                    else
                    {
                        result = new byte[8 + proxyInfo.ProxyCredential.UserName.Length + 1];
                    }
                }
                else
                {
                    if (proxyInfo.ProxyCredential == null)
                    {
                        result = new byte[8 + 1 + 1];
                    }
                    else
                    {
                        result = new byte[8 + proxyInfo.ProxyCredential.UserName.Length + 1 + proxyInfo.ProxyCredential.Domain.Length + 1];
                    }
                }

                result[0] = 4;
                result[1] = 1;

                result[2] = Convert.ToByte((remoteEndPoint.Port & 0xFF00) >> 8);
                result[3] = Convert.ToByte(remoteEndPoint.Port & 0xFF);

                if (proxyInfo.ProxyType == ProxyType.ptSOCKS4)
                {
                    Buffer.BlockCopy(remoteEndPoint.Address.GetAddressBytes(), 0, result, 4, 4);
                }
                else
                {
                    result[4] = 0;
                    result[5] = 0;
                    result[6] = 0;
                    result[7] = 1;
                }

                if ((proxyInfo.ProxyCredential != null) && (proxyInfo.ProxyCredential.UserName != null))
                {
                    Buffer.BlockCopy(Encoding.GetEncoding(1252).GetBytes(proxyInfo.ProxyCredential.UserName), 0, result, 8, proxyInfo.ProxyCredential.UserName.Length);
                }

                if ((proxyInfo.ProxyType == ProxyType.ptSOCKS4a) && (proxyInfo.ProxyCredential != null))
                {
                    Buffer.BlockCopy(Encoding.GetEncoding(1252).GetBytes(proxyInfo.ProxyCredential.Domain), 0, result, 8 + proxyInfo.ProxyCredential.UserName.Length + 1, proxyInfo.ProxyCredential.Domain.Length);
                }

                break;

            case ProxyType.ptSOCKS5:

                switch (proxyInfo.SOCKS5Phase)
                {
                case SOCKS5Phase.spIdle:

                    if (proxyInfo.ProxyCredential == null)
                    {
                        result = new byte[3];

                        result[0] = 5;
                        result[1] = 1;
                        result[2] = 0;
                    }
                    else
                    {
                        result = new byte[4];

                        result[0] = 5;
                        result[1] = 2;
                        result[2] = 0;
                        result[3] = 2;
                    }

                    proxyInfo.SOCKS5Phase = SOCKS5Phase.spGreeting;

                    break;

                case SOCKS5Phase.spConnecting:

                    result = new byte[10];

                    result[0] = 5;
                    result[1] = 1;
                    result[2] = 0;
                    result[3] = 1;

                    Buffer.BlockCopy(remoteEndPoint.Address.GetAddressBytes(), 0, result, 4, 4);

                    result[8] = Convert.ToByte((remoteEndPoint.Port & 0xFF00) >> 8);
                    result[9] = Convert.ToByte(remoteEndPoint.Port & 0xFF);

                    break;

                case SOCKS5Phase.spAuthenticating:

                    result = new byte[3 + proxyInfo.ProxyCredential.UserName.Length + proxyInfo.ProxyCredential.Password.Length];

                    result[0] = 5;
                    result[1] = Convert.ToByte(proxyInfo.ProxyCredential.UserName.Length);

                    Buffer.BlockCopy(Encoding.GetEncoding(1252).GetBytes(proxyInfo.ProxyCredential.UserName), 0, result, 2, proxyInfo.ProxyCredential.UserName.Length);

                    int passOffSet = 2 + proxyInfo.ProxyCredential.UserName.Length;
                    result[passOffSet] = Convert.ToByte(proxyInfo.ProxyCredential.Password.Length);

                    Buffer.BlockCopy(Encoding.GetEncoding(1252).GetBytes(proxyInfo.ProxyCredential.Password), 0, result, passOffSet + 1, proxyInfo.ProxyCredential.Password.Length);

                    break;
                }

                break;
            }

            return(result);
        }
예제 #6
0
        internal static void GetProxyResponseStatus(ProxyInfo proxyInfo, byte[] response)
        {
            switch (proxyInfo.ProxyType)
            {
            case ProxyType.ptHTTP:

                Match m = Regex.Match(Encoding.GetEncoding(1252).GetString(response), @"[HTTP/]\d[.]\d\s(?<code>\d+)\s(?<reason>.+)");

                if (m.Success)
                {
                    int code = Convert.ToInt32(m.Groups["code"].Value);

                    if (code >= 200 && code <= 299)
                    {
                        proxyInfo.Completed = true;
                    }
                    else
                    {
                        throw new ProxyAuthenticationException(code, m.Groups["reason"].Value);
                    }
                }
                else
                {
                    throw new ProxyAuthenticationException(0, "Invalid proxy message response.");
                }

                break;

            case ProxyType.ptSOCKS4:
            case ProxyType.ptSOCKS4a:

                if (response[1] == 0x5A)
                {
                    proxyInfo.Completed = true;
                }
                else
                {
                    switch (response[1])
                    {
                    case 0x5B:

                        throw new ProxyAuthenticationException(response[1], "Request rejected or failed.");

                    case 0x5C:

                        throw new ProxyAuthenticationException(response[1], "Client is not running identd.");

                    case 0x5D:

                        throw new ProxyAuthenticationException(response[1], "Client's identd could not confirm the user ID string in the request.");
                    }
                }

                break;

            case ProxyType.ptSOCKS5:

                switch (proxyInfo.SOCKS5Phase)
                {
                case SOCKS5Phase.spGreeting:

                    if (response[1] != 0xFF)
                    {
                        proxyInfo.SOCKS5Authentication = (SOCKS5AuthMode)Enum.ToObject(typeof(SOCKS5AuthMode), response[1]);

                        switch (proxyInfo.SOCKS5Authentication)
                        {
                        case SOCKS5AuthMode.saNoAuth:

                            proxyInfo.SOCKS5Phase = SOCKS5Phase.spConnecting;
                            break;

                        case SOCKS5AuthMode.ssUserPass:

                            proxyInfo.SOCKS5Phase = SOCKS5Phase.spAuthenticating;
                            break;
                        }
                    }
                    else
                    {
                        throw new ProxyAuthenticationException(0xFF, "Authentication method not supported.");
                    }

                    break;

                case SOCKS5Phase.spConnecting:
                case SOCKS5Phase.spAuthenticating:

                    if (response[1] == 0x00)
                    {
                        switch (proxyInfo.SOCKS5Phase)
                        {
                        case SOCKS5Phase.spConnecting:

                            proxyInfo.Completed = true;
                            break;

                        case SOCKS5Phase.spAuthenticating:

                            proxyInfo.SOCKS5Phase = SOCKS5Phase.spConnecting;
                            break;
                        }
                    }
                    else
                    {
                        switch (response[1])
                        {
                        case 0x01:

                            throw new ProxyAuthenticationException(response[1], "General Failure.");

                        case 0x02:

                            throw new ProxyAuthenticationException(response[1], "Connection not allowed by ruleset.");

                        case 0x03:

                            throw new ProxyAuthenticationException(response[1], "Network unreachable.");

                        case 0x04:

                            throw new ProxyAuthenticationException(response[1], "Host unreachable.");

                        case 0x05:

                            throw new ProxyAuthenticationException(response[1], "Connection refused by destination host.");

                        case 0x06:

                            throw new ProxyAuthenticationException(response[1], "TTL expired.");

                        case 0x07:

                            throw new ProxyAuthenticationException(response[1], "Command not supported / protocol error.");

                        case 0x08:

                            throw new ProxyAuthenticationException(response[1], "Address type not supported.");
                        }
                    }

                    break;
                }

                break;
            }
        }
예제 #7
0
        public SocketConnector AddConnector(string name, IPEndPoint remoteEndPoint, ProxyInfo proxyData, EncryptType encryptType, CompressionType compressionType, ICryptoService cryptoService, int reconnectAttempts, int reconnectAttemptInterval, IPEndPoint localEndPoint)
        {

            SocketConnector result = null;
            
            if (!Disposed)
            {
            
              result = new SocketConnector(this, name, remoteEndPoint, proxyData, encryptType, compressionType, cryptoService, reconnectAttempts, reconnectAttemptInterval, localEndPoint);
              AddCreator(result);
              
            }

            return result;
            
        }
예제 #8
0
 public SocketConnector AddConnector(string name, IPEndPoint remoteEndPoint, ProxyInfo proxyData, EncryptType encryptType, CompressionType compressionType, ICryptoService cryptoService, int reconnectAttempts, int reconnectAttemptInterval)
 {
     return AddConnector(name, remoteEndPoint, proxyData, encryptType, compressionType, cryptoService, reconnectAttempts, reconnectAttemptInterval, new IPEndPoint(IPAddress.Any, 0));
 }
예제 #9
0
 public SocketConnector AddConnector(string name, IPEndPoint remoteEndPoint, ProxyInfo proxyData)
 {
     return AddConnector(name, remoteEndPoint, proxyData, EncryptType.etNone, CompressionType.ctNone, null, 0, 0, new IPEndPoint(IPAddress.Any, 0));
 }
예제 #10
0
 public SocketConnector AddConnector(string name, IPEndPoint remoteEndPoint, ProxyInfo proxyData, EncryptType encryptType, CompressionType compressionType, ICryptoService cryptoService, int reconnectAttempts, int reconnectAttemptInterval)
 {
     return(AddConnector(name, remoteEndPoint, proxyData, encryptType, compressionType, cryptoService, reconnectAttempts, reconnectAttemptInterval, new IPEndPoint(IPAddress.Any, 0)));
 }
예제 #11
0
 public SocketConnector AddConnector(string name, IPEndPoint remoteEndPoint, ProxyInfo proxyData)
 {
     return(AddConnector(name, remoteEndPoint, proxyData, EncryptType.etNone, CompressionType.ctNone, null, 0, 0, new IPEndPoint(IPAddress.Any, 0)));
 }
예제 #12
0
        /// <summary>
        /// Base SocketConnector creator.
        /// </summary>
        /// <param name="host">
        /// Host.
        /// </param>
        /// <param name="remoteEndPoint">
        /// The remote endpoint to connect.
        /// </param>
        /// <param name="encryptType">
        /// Encrypt type.
        /// </param>
        /// <param name="compressionType">
        /// Compression type.
        /// </param>
        /// <param name="cryptoService">
        /// CryptoService. if null, will not be used.
        /// </param>
        /// <param name="localEndPoint">
        /// Local endpoint. if null, will be any address/port.
        /// </param>
        public SocketConnector(BaseSocketConnectionHost host, string name, IPEndPoint remoteEndPoint, ProxyInfo proxyData, EncryptType encryptType, CompressionType compressionType, ICryptoService cryptoService, int reconnectAttempts, int reconnectAttemptInterval, IPEndPoint localEndPoint)
            : base(host, name, localEndPoint, encryptType, compressionType, cryptoService)
        {

            FReconnectTimer = new Timer(new TimerCallback(ReconnectSocketConnection));
            FRemoteEndPoint = remoteEndPoint;

            FReconnectAttempts = reconnectAttempts;
            FReconnectAttemptInterval = reconnectAttemptInterval;

            FReconnectAttempted = -1;

            FProxyInfo = proxyData;

        }
예제 #13
0
        protected override void Free(bool canAccessFinalizable)
        {

            if (FReconnectTimer != null)
            {
                FReconnectTimer.Dispose();
                FReconnectTimer = null;
            }

            if (FSocket != null)
            {
                FSocket.Close();
                FSocket = null;
            }
            
            FRemoteEndPoint = null;
            FProxyInfo = null;

            base.Free(canAccessFinalizable);

        }