diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 9d8beac..4da78e7 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -33,6 +33,6 @@ // Можно задать все значения или принять номер построения и номер редакции по умолчанию, // используя "*", как показано ниже: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("3.3.0.0")] -[assembly: AssemblyFileVersion("3.3.0.0")] +[assembly: AssemblyVersion("3.3.1.0")] +[assembly: AssemblyFileVersion("3.3.1.0")] [assembly: NeutralResourcesLanguageAttribute("ru")] diff --git a/README.md b/README.md index b6b0f0f..7234c1a 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ xNet - a class library for .NET Framework which includes: * Classes for work with proxy servers: _HTTP, Socks4(a), Socks5, Chain_. * Classes for work with *HTTP 1.0/1.1* protocol: _keep-alive, gzip, deflate, chunked, SSL, proxies and more_. -Подробное описание на русском: http://habrahabr.ru/post/146475/ +Подробное описание на русском: http://habrahabr.ru/post/146475/
Если вы хотите поблагодарить автора: R284554004163 (WebMoney) Example: @@ -38,4 +38,4 @@ using (var request = new HttpRequest("http://site.com/")) // But in this request they will be gone. request.Post("/").None(); } - \ No newline at end of file + diff --git a/xNet/NetException.cs b/xNet/NetException.cs index 9aa668b..cb32c94 100644 --- a/xNet/NetException.cs +++ b/xNet/NetException.cs @@ -7,7 +7,8 @@ namespace xNet /// /// Исключение, которое выбрасывается, в случае возникновения ошибки при работе с сетью. /// - public class NetException : Exception, ISerializable + [Serializable] + public class NetException : Exception { #region Конструкторы (открытые) @@ -34,17 +35,5 @@ public NetException(string message, Exception innerException = null) /// Экземпляр класса , содержащий источник сериализованного потока, связанного с новым экземпляром класса . protected NetException(SerializationInfo serializationInfo, StreamingContext streamingContext) : base(serializationInfo, streamingContext) { } - - - /// - /// Заполняет экземпляр данными, необходимыми для сериализации исключения . - /// - /// Данные о сериализации, , которые должны использоваться. - /// Данные о сериализации, , которые должны использоваться. - [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)] - public override void GetObjectData(SerializationInfo serializationInfo, StreamingContext streamingContext) - { - base.GetObjectData(serializationInfo, streamingContext); - } } } \ No newline at end of file diff --git a/xNet/~Http/Http.cs b/xNet/~Http/Http.cs index c233791..29f87a4 100644 --- a/xNet/~Http/Http.cs +++ b/xNet/~Http/Http.cs @@ -83,8 +83,16 @@ public static class Http #region Статические поля (закрытые) - [ThreadStatic] - private static readonly Random _rand = new Random(); + [ThreadStatic] private static Random _rand; + private static Random Rand + { + get + { + if (_rand == null) + _rand = new Random(); + return _rand; + } + } #endregion @@ -341,7 +349,7 @@ public static string IEUserAgent() } else { - switch (_rand.Next(3)) + switch (Rand.Next(3)) { case 0: version = "10.0"; @@ -383,7 +391,7 @@ public static string OperaUserAgent() #region Генерация случайной версии - switch (_rand.Next(4)) + switch (Rand.Next(4)) { case 0: version = "12.16"; @@ -424,7 +432,7 @@ public static string ChromeUserAgent() #region Генерация случайной версии - switch (_rand.Next(5)) + switch (Rand.Next(5)) { case 0: version = "41.0.2228.0"; @@ -470,7 +478,7 @@ public static string FirefoxUserAgent() #region Генерация случайной версии - switch (_rand.Next(5)) + switch (Rand.Next(5)) { case 0: version = "36.0"; @@ -518,7 +526,7 @@ public static string OperaMiniUserAgent() #region Генерация случайной версии - switch (_rand.Next(3)) + switch (Rand.Next(3)) { case 0: os = "iOS"; @@ -602,7 +610,7 @@ private static string RandomWindowsVersion() { string windowsVersion = "Windows NT "; - switch (_rand.Next(4)) + switch (Rand.Next(4)) { case 0: windowsVersion += "5.1"; // Windows XP @@ -621,7 +629,7 @@ private static string RandomWindowsVersion() break; } - if (_rand.NextDouble() < 0.2) + if (Rand.NextDouble() < 0.2) { windowsVersion += "; WOW64"; // 64-битная версия. } diff --git a/xNet/~Http/HttpException.cs b/xNet/~Http/HttpException.cs index 0c1f6fd..0141fbf 100644 --- a/xNet/~Http/HttpException.cs +++ b/xNet/~Http/HttpException.cs @@ -7,7 +7,8 @@ namespace xNet /// /// Исключение, которое выбрасывается, в случае возникновения ошибки при работе с HTTP-протоколом. /// - public sealed class HttpException : NetException, ISerializable + [Serializable] + public sealed class HttpException : NetException { #region Свойства (открытые) @@ -65,7 +66,14 @@ public HttpException(string message, HttpExceptionStatus status, /// Экземпляр класса , который содержит сведения, требуемые для сериализации нового экземпляра класса . /// Экземпляр класса , содержащий источник сериализованного потока, связанного с новым экземпляром класса . protected HttpException(SerializationInfo serializationInfo, StreamingContext streamingContext) - : base(serializationInfo, streamingContext) { } + : base(serializationInfo, streamingContext) + { + if (serializationInfo != null) + { + Status = (HttpExceptionStatus)serializationInfo.GetInt32("Status"); + HttpStatusCode = (HttpStatusCode)serializationInfo.GetInt32("HttpStatusCode"); + } + } /// @@ -77,6 +85,12 @@ protected HttpException(SerializationInfo serializationInfo, StreamingContext st public override void GetObjectData(SerializationInfo serializationInfo, StreamingContext streamingContext) { base.GetObjectData(serializationInfo, streamingContext); + + if (serializationInfo != null) + { + serializationInfo.AddValue("Status", (int)Status); + serializationInfo.AddValue("HttpStatusCode", (int)HttpStatusCode); + } } } } \ No newline at end of file diff --git a/xNet/~Http/~Content/MultipartContent.cs b/xNet/~Http/~Content/MultipartContent.cs index 2ac8da6..3f868eb 100644 --- a/xNet/~Http/~Content/MultipartContent.cs +++ b/xNet/~Http/~Content/MultipartContent.cs @@ -43,8 +43,16 @@ public bool IsFieldFile() #region Статические поля (закрытые) - [ThreadStatic] - private static readonly Random _rand = new Random(); + [ThreadStatic] private static Random _rand; + private static Random Rand + { + get + { + if (_rand == null) + _rand = new Random(); + return _rand; + } + } #endregion @@ -397,18 +405,18 @@ public static string GetRandomString(int length) for (int i = 0; i < length; ++i) { - switch (_rand.Next(3)) + switch (Rand.Next(3)) { case 0: - strBuilder.Append((char)_rand.Next(48, 58)); + strBuilder.Append((char)Rand.Next(48, 58)); break; case 1: - strBuilder.Append((char)_rand.Next(97, 123)); + strBuilder.Append((char)Rand.Next(97, 123)); break; case 2: - strBuilder.Append((char)_rand.Next(65, 91)); + strBuilder.Append((char)Rand.Next(65, 91)); break; } } diff --git a/xNet/~Proxy/ChainProxyClient.cs b/xNet/~Proxy/ChainProxyClient.cs index f9055c8..a02a480 100644 --- a/xNet/~Proxy/ChainProxyClient.cs +++ b/xNet/~Proxy/ChainProxyClient.cs @@ -13,8 +13,16 @@ public class ChainProxyClient : ProxyClient { #region Статические поля (закрытые) - [ThreadStatic] - private static readonly Random _rand = new Random(); + [ThreadStatic] private static Random _rand; + private static Random Rand + { + get + { + if (_rand == null) + _rand = new Random(); + return _rand; + } + } #endregion @@ -203,7 +211,7 @@ public override TcpClient CreateConnection(string destinationHost, int destinati // Перемешиваем прокси. for (int i = 0; i < proxies.Count; i++) { - int randI = _rand.Next(proxies.Count); + int randI = Rand.Next(proxies.Count); ProxyClient proxy = proxies[i]; proxies[i] = proxies[randI]; diff --git a/xNet/~Proxy/HttpProxyClient.cs b/xNet/~Proxy/HttpProxyClient.cs index 92272c5..d338e24 100644 --- a/xNet/~Proxy/HttpProxyClient.cs +++ b/xNet/~Proxy/HttpProxyClient.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Net; using System.Net.Sockets; @@ -8,11 +8,11 @@ namespace xNet { /// - /// HTTP -. + /// Представляет клиент для HTTP прокси-сервера. /// public class HttpProxyClient : ProxyClient { - #region () + #region Константы (закрытые) private const int BufferSize = 50; private const int DefaultPort = 8080; @@ -20,63 +20,63 @@ public class HttpProxyClient : ProxyClient #endregion - #region () + #region Конструкторы (открытые) /// - /// . + /// Инициализирует новый экземпляр класса . /// public HttpProxyClient() : this(null) { } /// - /// -, - 8080. + /// Инициализирует новый экземпляр класса заданным хостом прокси-сервера, и устанавливает порт равным - 8080. /// - /// -. + /// Хост прокси-сервера. public HttpProxyClient(string host) : this(host, DefaultPort) { } /// - /// -. + /// Инициализирует новый экземпляр класса заданными данными о прокси-сервере. /// - /// -. - /// -. + /// Хост прокси-сервера. + /// Порт прокси-сервера. public HttpProxyClient(string host, int port) : this(host, port, string.Empty, string.Empty) { } /// - /// -. + /// Инициализирует новый экземпляр класса заданными данными о прокси-сервере. /// - /// -. - /// -. - /// -. - /// -. + /// Хост прокси-сервера. + /// Порт прокси-сервера. + /// Имя пользователя для авторизации на прокси-сервере. + /// Пароль для авторизации на прокси-сервере. public HttpProxyClient(string host, int port, string username, string password) : base(ProxyType.Http, host, port, username, password) { } #endregion - #region () + #region Статические методы (открытые) /// - /// . + /// Преобразует строку в экземпляр класса . /// - /// - ::_:. . - /// . - /// . - /// . - /// . + /// Строка вида - хост:порт:имя_пользователя:пароль. Три последних параметра являются необязательными. + /// Экземпляр класса . + /// Значение параметра равно . + /// Значение параметра является пустой строкой. + /// Формат порта является неправильным. public static HttpProxyClient Parse(string proxyAddress) { return ProxyClient.Parse(ProxyType.Http, proxyAddress) as HttpProxyClient; } /// - /// . , , . + /// Преобразует строку в экземпляр класса . Возвращает значение, указывающее, успешно ли выполнено преобразование. /// - /// - ::_:. . - /// , , . - /// , , . + /// Строка вида - хост:порт:имя_пользователя:пароль. Три последних параметра являются необязательными. + /// Если преобразование выполнено успешно, то содержит экземпляр класса , иначе . + /// Значение , если параметр преобразован успешно, иначе . public static bool TryParse(string proxyAddress, out HttpProxyClient result) { ProxyClient proxy; @@ -96,34 +96,34 @@ public static bool TryParse(string proxyAddress, out HttpProxyClient result) #endregion - #region () + #region Методы (открытые) /// - /// -. + /// Создаёт соединение с сервером через прокси-сервер. /// - /// , -. - /// , -. - /// , , . - /// -. + /// Хост сервера, с которым нужно связаться через прокси-сервер. + /// Порт сервера, с которым нужно связаться через прокси-сервер. + /// Соединение, через которое нужно работать, или значение . + /// Соединение с сервером через прокси-сервер. /// - /// . - /// -- - /// 1 65535. - /// -- - /// 255 . - /// -- - /// 255 . + /// Значение свойства равно или имеет нулевую длину. + /// -или- + /// Значение свойства меньше 1 или больше 65535. + /// -или- + /// Значение свойства имеет длину более 255 символов. + /// -или- + /// Значение свойства имеет длину более 255 символов. /// - /// . - /// . - /// 1 65535. - /// -. - /// 80, 'CONNECT'. + /// Значение параметра равно . + /// Значение параметра является пустой строкой. + /// Значение параметра меньше 1 или больше 65535. + /// Ошибка при работе с прокси-сервером. + /// Если порт сервера неравен 80, то для подключения используется метод 'CONNECT'. public override TcpClient CreateConnection(string destinationHost, int destinationPort, TcpClient tcpClient = null) { CheckState(); - #region + #region Проверка параметров if (destinationHost == null) { @@ -187,7 +187,7 @@ public override TcpClient CreateConnection(string destinationHost, int destinati #endregion - #region () + #region Методы (закрытые) private string GenerateAuthorizationHeader() { @@ -235,7 +235,7 @@ private HttpStatusCode ReceiveResponse(NetworkStream nStream) throw NewProxyException(Resources.ProxyException_ReceivedEmptyResponse); } - // . : HTTP/1.1 200 OK\r\n + // Выделяем строку статуса. Пример: HTTP/1.1 200 OK\r\n string strStatus = response.Substring(" ", Http.NewLine); int simPos = strStatus.IndexOf(' '); diff --git a/xNet/~Proxy/ProxyException.cs b/xNet/~Proxy/ProxyException.cs index 145370b..5d4d400 100644 --- a/xNet/~Proxy/ProxyException.cs +++ b/xNet/~Proxy/ProxyException.cs @@ -1,41 +1,42 @@ -using System; +using System; using System.Runtime.Serialization; using System.Security.Permissions; namespace xNet { /// - /// , , . + /// Исключение, которое выбрасывается, в случае возникновения ошибки при работе с прокси. /// - public sealed class ProxyException : NetException, ISerializable + [Serializable] + public sealed class ProxyException : NetException { /// - /// -, . + /// Возвращает прокси-клиент, в котором произошла ошибка. /// public ProxyClient ProxyClient { get; private set; } - #region () + #region Конструкторы (открытые) /// - /// . + /// Инициализирует новый экземпляр класса . /// public ProxyException() : this(Resources.ProxyException_Default) { } /// - /// . + /// Инициализирует новый экземпляр класса заданным сообщением об ошибке. /// - /// . - /// , , . + /// Сообщение об ошибке с объяснением причины исключения. + /// Исключение, вызвавшее текущие исключение, или значение . public ProxyException(string message, Exception innerException = null) : base(message, innerException) { } /// - /// -. + /// Инициализирует новый экземпляр класса заданным сообщением об ошибке и прокси-клиентом. /// - /// . - /// -, . - /// , , . + /// Сообщение об ошибке с объяснением причины исключения. + /// Прокси-клиент, в котором произошла ошибка. + /// Исключение, вызвавшее текущие исключение, или значение . public ProxyException(string message, ProxyClient proxyClient, Exception innerException = null) : base(message, innerException) { @@ -46,23 +47,11 @@ public ProxyException(string message, ProxyClient proxyClient, Exception innerEx /// - /// . + /// Инициализирует новый экземпляр класса заданными экземплярами и . /// - /// , , . - /// , , . + /// Экземпляр класса , который содержит сведения, требуемые для сериализации нового экземпляра класса . + /// Экземпляр класса , содержащий источник сериализованного потока, связанного с новым экземпляром класса . protected ProxyException(SerializationInfo serializationInfo, StreamingContext streamingContext) : base(serializationInfo, streamingContext) { } - - - /// - /// , . - /// - /// , , . - /// , , . - [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)] - public override void GetObjectData(SerializationInfo serializationInfo, StreamingContext streamingContext) - { - base.GetObjectData(serializationInfo, streamingContext); - } } } \ No newline at end of file diff --git a/xNet/~Proxy/Socks4ProxyClient.cs b/xNet/~Proxy/Socks4ProxyClient.cs index 3e9628e..52bc3c1 100644 --- a/xNet/~Proxy/Socks4ProxyClient.cs +++ b/xNet/~Proxy/Socks4ProxyClient.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Net; using System.Net.Sockets; @@ -7,11 +7,11 @@ namespace xNet { /// - /// Socks4 -. + /// Представляет клиент для Socks4 прокси-сервера. /// public class Socks4ProxyClient : ProxyClient { - #region () + #region Константы (защищённые) internal protected const int DefaultPort = 1080; @@ -26,62 +26,62 @@ public class Socks4ProxyClient : ProxyClient #endregion - #region () + #region Конструкторы (открытые) /// - /// . + /// Инициализирует новый экземпляр класса . /// public Socks4ProxyClient() : this(null) { } /// - /// -, - 1080. + /// Инициализирует новый экземпляр класса заданным хостом прокси-сервера, и устанавливает порт равным - 1080. /// - /// -. + /// Хост прокси-сервера. public Socks4ProxyClient(string host) : this(host, DefaultPort) { } /// - /// -. + /// Инициализирует новый экземпляр класса заданными данными о прокси-сервере. /// - /// -. - /// -. + /// Хост прокси-сервера. + /// Порт прокси-сервера. public Socks4ProxyClient(string host, int port) : this(host, port, string.Empty) { } /// - /// -. + /// Инициализирует новый экземпляр класса заданными данными о прокси-сервере. /// - /// -. - /// -. - /// -. + /// Хост прокси-сервера. + /// Порт прокси-сервера. + /// Имя пользователя для авторизации на прокси-сервере. public Socks4ProxyClient(string host, int port, string username) : base(ProxyType.Socks4, host, port, username, null) { } #endregion - #region () + #region Статические методы (закрытые) /// - /// . + /// Преобразует строку в экземпляр класса . /// - /// - ::_:. . - /// . - /// . - /// . - /// . + /// Строка вида - хост:порт:имя_пользователя:пароль. Три последних параметра являются необязательными. + /// Экземпляр класса . + /// Значение параметра равно . + /// Значение параметра является пустой строкой. + /// Формат порта является неправильным. public static Socks4ProxyClient Parse(string proxyAddress) { return ProxyClient.Parse(ProxyType.Socks4, proxyAddress) as Socks4ProxyClient; } /// - /// . , , . + /// Преобразует строку в экземпляр класса . Возвращает значение, указывающее, успешно ли выполнено преобразование. /// - /// - ::_:. . - /// , , . - /// , , . + /// Строка вида - хост:порт:имя_пользователя:пароль. Три последних параметра являются необязательными. + /// Если преобразование выполнено успешно, то содержит экземпляр класса , иначе . + /// Значение , если параметр преобразован успешно, иначе . public static bool TryParse(string proxyAddress, out Socks4ProxyClient result) { ProxyClient proxy; @@ -102,30 +102,30 @@ public static bool TryParse(string proxyAddress, out Socks4ProxyClient result) /// - /// -. + /// Создаёт соединение с сервером через прокси-сервер. /// - /// , -. - /// , -. - /// , , . - /// -. + /// Хост сервера, с которым нужно связаться через прокси-сервер. + /// Порт сервера, с которым нужно связаться через прокси-сервер. + /// Соединение, через которое нужно работать, или значение . + /// Соединение с сервером через прокси-сервер. /// - /// . - /// -- - /// 1 65535. - /// -- - /// 255 . - /// -- - /// 255 . + /// Значение свойства равно или имеет нулевую длину. + /// -или- + /// Значение свойства меньше 1 или больше 65535. + /// -или- + /// Значение свойства имеет длину более 255 символов. + /// -или- + /// Значение свойства имеет длину более 255 символов. /// - /// . - /// . - /// 1 65535. - /// -. + /// Значение параметра равно . + /// Значение параметра является пустой строкой. + /// Значение параметра меньше 1 или больше 65535. + /// Ошибка при работе с прокси-сервером. public override TcpClient CreateConnection(string destinationHost, int destinationPort, TcpClient tcpClient = null) { CheckState(); - #region + #region Проверка параметров if (destinationHost == null) { @@ -171,7 +171,7 @@ public override TcpClient CreateConnection(string destinationHost, int destinati } - #region ( ) + #region Методы (внутренние защищённые) internal protected virtual void SendCommand(NetworkStream nStream, byte command, string destinationHost, int destinationPort) { @@ -206,7 +206,7 @@ internal protected virtual void SendCommand(NetworkStream nStream, byte command, byte reply = response[1]; - // . + // Если запрос не выполнен. if (reply != CommandReplyRequestGranted) { HandleCommandError(reply); diff --git a/xNet/~Proxy/Socks4aProxyClient.cs b/xNet/~Proxy/Socks4aProxyClient.cs index 6373a8c..55558bd 100644 --- a/xNet/~Proxy/Socks4aProxyClient.cs +++ b/xNet/~Proxy/Socks4aProxyClient.cs @@ -1,42 +1,42 @@ -using System.Net.Sockets; +using System.Net.Sockets; using System.Text; namespace xNet { /// - /// Socks4a -. + /// Представляет клиент для Socks4a прокси-сервера. /// public class Socks4aProxyClient : Socks4ProxyClient { - #region () + #region Конструкторы (открытые) /// - /// . + /// Инициализирует новый экземпляр класса . /// public Socks4aProxyClient() : this(null) { } /// - /// -, - 1080. + /// Инициализирует новый экземпляр класса заданным хостом прокси-сервера, и устанавливает порт равным - 1080. /// - /// -. + /// Хост прокси-сервера. public Socks4aProxyClient(string host) : this(host, DefaultPort) { } /// - /// -. + /// Инициализирует новый экземпляр класса заданными данными о прокси-сервере. /// - /// -. - /// -. + /// Хост прокси-сервера. + /// Порт прокси-сервера. public Socks4aProxyClient(string host, int port) : this(host, port, string.Empty) { } /// - /// -. + /// Инициализирует новый экземпляр класса заданными данными о прокси-сервере. /// - /// -. - /// -. - /// -. + /// Хост прокси-сервера. + /// Порт прокси-сервера. + /// Имя пользователя для авторизации на прокси-сервере. public Socks4aProxyClient(string host, int port, string username) : base(host, port, username) { @@ -46,27 +46,27 @@ public Socks4aProxyClient(string host, int port, string username) #endregion - #region () + #region Методы (открытые) /// - /// . + /// Преобразует строку в экземпляр класса . /// - /// - ::_:. . - /// . - /// . - /// . - /// . + /// Строка вида - хост:порт:имя_пользователя:пароль. Три последних параметра являются необязательными. + /// Экземпляр класса . + /// Значение параметра равно . + /// Значение параметра является пустой строкой. + /// Формат порта является неправильным. public static Socks4aProxyClient Parse(string proxyAddress) { return ProxyClient.Parse(ProxyType.Socks4a, proxyAddress) as Socks4aProxyClient; } /// - /// . , , . + /// Преобразует строку в экземпляр класса . Возвращает значение, указывающее, успешно ли выполнено преобразование. /// - /// - ::_:. . - /// , , . - /// , , . + /// Строка вида - хост:порт:имя_пользователя:пароль. Три последних параметра являются необязательными. + /// Если преобразование выполнено успешно, то содержит экземпляр класса , иначе . + /// Значение , если параметр преобразован успешно, иначе . public static bool TryParse(string proxyAddress, out Socks4aProxyClient result) { ProxyClient proxy; @@ -123,7 +123,7 @@ internal protected override void SendCommand(NetworkStream nStream, byte command byte reply = response[1]; - // . + // Если запрос не выполнен. if (reply != CommandReplyRequestGranted) { HandleCommandError(reply); diff --git a/xNet/~Proxy/Socks5ProxyClient.cs b/xNet/~Proxy/Socks5ProxyClient.cs index aca2d9a..8781498 100644 --- a/xNet/~Proxy/Socks5ProxyClient.cs +++ b/xNet/~Proxy/Socks5ProxyClient.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Net; using System.Net.Sockets; @@ -7,11 +7,11 @@ namespace xNet { /// - /// Socks5 -. + /// Представляет клиент для Socks5 прокси-сервера. /// public class Socks5ProxyClient : ProxyClient { - #region () + #region Константы (закрытые) private const int DefaultPort = 1080; @@ -44,63 +44,63 @@ public class Socks5ProxyClient : ProxyClient #endregion - #region () + #region Конструкторы (открытые) /// - /// . + /// Инициализирует новый экземпляр класса . /// public Socks5ProxyClient() : this(null) { } /// - /// -, - 1080. + /// Инициализирует новый экземпляр класса заданным хостом прокси-сервера, и устанавливает порт равным - 1080. /// - /// -. + /// Хост прокси-сервера. public Socks5ProxyClient(string host) : this(host, DefaultPort) { } /// - /// -. + /// Инициализирует новый экземпляр класса заданными данными о прокси-сервере. /// - /// -. - /// -. + /// Хост прокси-сервера. + /// Порт прокси-сервера. public Socks5ProxyClient(string host, int port) : this(host, port, string.Empty, string.Empty) { } /// - /// -. + /// Инициализирует новый экземпляр класса заданными данными о прокси-сервере. /// - /// -. - /// -. - /// -. - /// -. + /// Хост прокси-сервера. + /// Порт прокси-сервера. + /// Имя пользователя для авторизации на прокси-сервере. + /// Пароль для авторизации на прокси-сервере. public Socks5ProxyClient(string host, int port, string username, string password) : base(ProxyType.Socks5, host, port, username, password) { } #endregion - #region () + #region Статические методы (открытые) /// - /// . + /// Преобразует строку в экземпляр класса . /// - /// - ::_:. . - /// . - /// . - /// . - /// . + /// Строка вида - хост:порт:имя_пользователя:пароль. Три последних параметра являются необязательными. + /// Экземпляр класса . + /// Значение параметра равно . + /// Значение параметра является пустой строкой. + /// Формат порта является неправильным. public static Socks5ProxyClient Parse(string proxyAddress) { return ProxyClient.Parse(ProxyType.Socks5, proxyAddress) as Socks5ProxyClient; } /// - /// . , , . + /// Преобразует строку в экземпляр класса . Возвращает значение, указывающее, успешно ли выполнено преобразование. /// - /// - ::_:. . - /// , , . - /// , , . + /// Строка вида - хост:порт:имя_пользователя:пароль. Три последних параметра являются необязательными. + /// Если преобразование выполнено успешно, то содержит экземпляр класса , иначе . + /// Значение , если параметр преобразован успешно, иначе . public static bool TryParse(string proxyAddress, out Socks5ProxyClient result) { ProxyClient proxy; @@ -121,30 +121,30 @@ public static bool TryParse(string proxyAddress, out Socks5ProxyClient result) /// - /// -. + /// Создаёт соединение с сервером через прокси-сервер. /// - /// , -. - /// , -. - /// , , . - /// -. + /// Хост сервера, с которым нужно связаться через прокси-сервер. + /// Порт сервера, с которым нужно связаться через прокси-сервер. + /// Соединение, через которое нужно работать, или значение . + /// Соединение с сервером через прокси-сервер. /// - /// . - /// -- - /// 1 65535. - /// -- - /// 255 . - /// -- - /// 255 . + /// Значение свойства равно или имеет нулевую длину. + /// -или- + /// Значение свойства меньше 1 или больше 65535. + /// -или- + /// Значение свойства имеет длину более 255 символов. + /// -или- + /// Значение свойства имеет длину более 255 символов. /// - /// . - /// . - /// 1 65535. - /// -. + /// Значение параметра равно . + /// Значение параметра является пустой строкой. + /// Значение параметра меньше 1 или больше 65535. + /// Ошибка при работе с прокси-сервером. public override TcpClient CreateConnection(string destinationHost, int destinationPort, TcpClient tcpClient = null) { CheckState(); - #region + #region Проверка параметров if (destinationHost == null) { @@ -193,7 +193,7 @@ public override TcpClient CreateConnection(string destinationHost, int destinati } - #region () + #region Методы (закрытые) private void InitialNegotiation(NetworkStream nStream) { @@ -315,7 +315,7 @@ private void SendCommand(NetworkStream nStream, byte command, string destination byte reply = response[1]; - // . + // Если запрос не выполнен. if (reply != CommandReplySucceeded) { HandleCommandError(reply);