Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.22.119.251] |
|
Сообщ.
#1
,
|
|
|
Вот пишу я клиента TCP
Socket TempSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipep = new IPEndPoint( IPAddress.Parse(AdressOfServer), 9050); TempSocket.BeginConnect(ipep, new AsyncCallback(Connected), TempSocket); А что если программа запустится и попытается подконнектиться на компьютере, который имеет выход в интернет через прокси? Мы ведь нигде этого не указываем в подключении в коде. Например браузеру, чтобы он смог коннектиться в интернет указывается в настройках прокси(если комп выходит в инет через прокси), а иначе он не сможет установить соединение. Моя программа я так понимаю тоже не сможет подконнектиться, тогда как с использованием сокетов указать, что выход будет через прокси? |
Сообщ.
#2
,
|
|
|
Пиши в Microsoft .NET Framework SDK слово Proxy
и у тебя так столько классов для работы с прокси и его созданию выпадет. |
Сообщ.
#3
,
|
|
|
но я сецчас говорю о классе socket, и как используя класс cocket указать, что мы хотим использовать прокси.
|
Сообщ.
#4
,
|
|
|
Делай наследника этих классов
|
Сообщ.
#5
,
|
|
|
Скрести их
|
Сообщ.
#6
,
|
|
|
Я делал на VC++ 6.0 приложение которое было основано на сокетах и работало в сети с прокси сервером. Маленькое "но" - мое приложение работало только с вэб, т.е. соединения шли на 80 порт.
Реализовано все было следующим образом: 1. Создать сокет, IP адрес получателя - адрес прокси-сервера, порт получателя - порт прокси - сервера 2. Сформировать НТТР запрос к ресурсу, на пример GET /some_page.html HTTP/1.1 Host: www.host.com 3. Выполнить Send Этот пример использует прокси-сервер без аутентификации. Для аутентификации на сервере НТТР запрос должен быть несколько изменен. Если найду, выложу исходник своего приложения. |
Сообщ.
#7
,
|
|
|
Цитата Host: www.host.com А что за хост? При работе с сокетами, вроде нигде этого не указывается. |
Сообщ.
#8
,
|
|
|
В описаном мною примере НТТР запрос отправляется прокси серверу, который перенаправляет его на необходимый узел. В моем случае это www.host.com. Я ведь указал что это пример для работы с веб-сервером.
|
Сообщ.
#9
,
|
|
|
Цитата kosten_spb @ 28.12.04, 18:13 В описаном мною примере НТТР запрос отправляется прокси серверу, который перенаправляет его на необходимый узел. В моем случае это www.host.com. Я ведь указал что это пример для работы с веб-сервером. Спасибо. Добавлено кстати, если кому интересно, то на codeproject.com нарыл класс, который реализует оболчку над Socket работающий по протоколу SOCKS5. using System; using System.Net; using System.Net.Sockets; using System.Text; /* * zahmed * Date 23 Jan 2004 * Socks 5 RFC is available at http://www.faqs.org/rfcs/rfc1928.html. */ namespace LMKR { public class ConnectionException:ApplicationException { public ConnectionException(string message) :base(message) { } } /// <summary> /// Provides sock5 functionality to clients (Connect only). /// </summary> public class SocksProxy { private SocksProxy(){} #region ErrorMessages private static string[] errorMsgs= { "Operation completed successfully.", "General SOCKS server failure.", "Connection not allowed by ruleset.", "Network unreachable.", "Host unreachable.", "Connection refused.", "TTL expired.", "Command not supported.", "Address type not supported.", "Unknown error." }; #endregion public static Socket ConnectToSocks5Proxy(string proxyAdress, ushort proxyPort, string destAddress, ushort destPort, string userName, string password) { IPAddress destIP = null; IPAddress proxyIP = null; byte[] request = new byte[257]; byte[] response = new byte[257]; ushort nIndex; try { proxyIP = IPAddress.Parse(proxyAdress); } catch(FormatException) { // get the IP address proxyIP = Dns.GetHostByAddress(proxyAdress).AddressList[0]; } // Parse destAddress (assume it in string dotted format "212.116.65.112" ) try { destIP = IPAddress.Parse(destAddress); } catch(FormatException) { // wrong assumption its in domain name format "www.microsoft.com" } IPEndPoint proxyEndPoint = new IPEndPoint(proxyIP,proxyPort); // open a TCP connection to SOCKS server... Socket s = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); s.Connect(proxyEndPoint); nIndex = 0; request[nIndex++]=0x05; // Version 5. request[nIndex++]=0x02; // 2 Authentication methods are in packet... request[nIndex++]=0x00; // NO AUTHENTICATION REQUIRED request[nIndex++]=0x02; // USERNAME/PASSWORD // Send the authentication negotiation request... s.Send(request,nIndex,SocketFlags.None); // Receive 2 byte response... int nGot = s.Receive(response,2,SocketFlags.None); if (nGot!=2) throw new ConnectionException("Bad response received from proxy server."); if (response[1]==0xFF) { // No authentication method was accepted close the socket. s.Close(); throw new ConnectionException("None of the authentication method was accepted by proxy server."); } byte[] rawBytes; if (/*response[1]==0x02*/true) {//Username/Password Authentication protocol nIndex = 0; request[nIndex++]=0x05; // Version 5. // add user name request[nIndex++]=(byte)userName.Length; rawBytes = Encoding.Default.GetBytes(userName); rawBytes.CopyTo(request,nIndex); nIndex+=(ushort)rawBytes.Length; // add password request[nIndex++]=(byte)password.Length; rawBytes = Encoding.Default.GetBytes(password); rawBytes.CopyTo(request,nIndex); nIndex+=(ushort)rawBytes.Length; // Send the Username/Password request s.Send(request,nIndex,SocketFlags.None); // Receive 2 byte response... nGot = s.Receive(response,2,SocketFlags.None); if (nGot!=2) throw new ConnectionException("Bad response received from proxy server."); if (response[1] != 0x00) throw new ConnectionException("Bad Usernaem/Password."); } // This version only supports connect command. // UDP and Bind are not supported. // Send connect request now... nIndex = 0; request[nIndex++]=0x05; // version 5. request[nIndex++]=0x01; // command = connect. request[nIndex++]=0x00; // Reserve = must be 0x00 if (destIP != null) {// Destination adress in an IP. switch(destIP.AddressFamily) { case AddressFamily.InterNetwork: // Address is IPV4 format request[nIndex++]=0x01; rawBytes = destIP.GetAddressBytes(); rawBytes.CopyTo(request,nIndex); nIndex+=(ushort)rawBytes.Length; break; case AddressFamily.InterNetworkV6: // Address is IPV6 format request[nIndex++]=0x04; rawBytes = destIP.GetAddressBytes(); rawBytes.CopyTo(request,nIndex); nIndex+=(ushort)rawBytes.Length; break; } } else {// Dest. address is domain name. request[nIndex++]=0x03; // Address is full-qualified domain name. request[nIndex++]=Convert.ToByte(destAddress.Length); // length of address. rawBytes = Encoding.Default.GetBytes(destAddress); rawBytes.CopyTo(request,nIndex); nIndex+=(ushort)rawBytes.Length; } // using big-edian byte order byte[] portBytes = BitConverter.GetBytes(destPort); for (int i=portBytes.Length-1;i>=0;i--) request[nIndex++]=portBytes[i]; // send connect request. s.Send(request,nIndex,SocketFlags.None); s.Receive(response); // Get variable length response... if (response[1]!=0x00) throw new ConnectionException(errorMsgs[response[1]]); // Success Connected... return s; } } } |