Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Сокеты Windows и прокси сервер   Найти похожие ветки 

 
DmitryA   (2009-11-04 18:45) [0]

Как можно использовать стандартные функции работы с сокетами в Windows для прокси? В общем есть программы клиента и сервера, написанные на сокетах. Но между ними поставили проху. Как через него достучаться?


 
Сергей М. ©   (2009-11-04 19:11) [1]

Прокси - это такая же программа-сервер, как и та которая у тебя "в общем есть". Поэтому для "достукивания" к ней используются те же самые функции - socket(), bind(), connect(), recv(), send() и т.д. и т.п.


 
DmitryA   (2009-11-05 12:49) [2]

Это понятно. Ну вот я с ней соединился. А дальше как за нее выйти к требуемому хосту? У сокета только одно соединение на один хост, а тут получается 2, одно на прокси, второе - целевое (конечное).


 
Сергей М. ©   (2009-11-05 13:03) [3]


> А дальше как


А дальше все зависит от протокола, который поддерживает тот прокси, к которому ты обращаешься.
Это м.б. и HTTP, и HTTPS, и SOCKS4/4a/5, и .. да мало ли разных протоколов и соответствующих прокси ..


 
Сергей М. ©   (2009-11-05 13:08) [4]


> У сокета только одно соединение на один хост, а тут получается
> 2, одно на прокси, второе - целевое (конечное).


И тут тоже получается одно - к прокси-серверу.
А тот уже, по просьбе клиента на языке соответствующего прокси-протокола, соединяется с целевым сервером.
На то он и прокси (от англ. proxy  - посредник), чтобы быть посредником в коммуникациях между клиентами и серверами.


 
DmitryA   (2009-11-05 13:51) [5]

Это мне понятно, но задача в другом. Есть уже написанный сервер и разные клиенты, которые работают используя WinSock, типа TCustomIpClient. И у них только свойство LocalHost (Specifies the name of the local system) и RemoteHost (Specifies the name of the remote system). Так говорит хелп. На это уровне нет понятия протокола (HTTP, и HTTPS, и SOCKS4/4a/5). Т.е. если у прокси стоит не прорачное проксирование , то клиент вообще не может никуда выйти, прокси его не пускает. Тем более мне непонятно как быть в случае авторизации на прокси, т.к. на это уровне нет понятия авторизации. Или я вообще ничего не понимаю?!


 
Сергей М. ©   (2009-11-05 14:16) [6]


> Есть уже написанный сервер


И пусть он себе есть - его этот вопрос совершенно не касается.


> На это уровне нет понятия протокола (HTTP, и HTTPS, и SOCKS4/4a/5)


Совершенно верно.


> и разные клиенты


Они на каком языке с сервером разговаривают ?
Какой-то стандартный прикладной протокол используется или самописный ?


 
Anatoly Podgoretsky ©   (2009-11-05 14:46) [7]


> DmitryA   (05.11.09 12:49) [2]

Обычно никак, как правило в случае прокси, никуда не выпускают, это могила, последний вздох, дальше работает только прокси и результат возвращается клиенту. Но бессмысленно говорить о прокси, надо говорить об конкретном прокси и смотреть его протокол.


 
Anatoly Podgoretsky ©   (2009-11-05 14:48) [8]

Иногда прокси называют сессионную систему авторизации. Когда выпуск во вне производится по паролю на сессию. Это просто выключатель, если включено, то пакеты идут дальше, если нет, то умирают.


 
DmitryA   (2009-11-05 15:42) [9]

Используется самописный протокол.


 
DmitryA   (2009-11-05 15:49) [10]

Т.е. получается, без вариантов? Это как-то грустно ;(... Но работают же как-то другие системы или у нас в мире настолько все стало единообразно, что только стандартные системы рабоают?


 
Anatoly Podgoretsky ©   (2009-11-05 16:01) [11]

> DmitryA  (05.11.2009 15:42:09)  [9]

Самописный протокол требует и самописного подключения к прокси.


 
DmitryA   (2009-11-05 16:15) [12]

Вот это-то и понятно. Но как это сделать имея только класс типа TCustomIpClient?


 
Anatoly Podgoretsky ©   (2009-11-05 16:20) [13]

> DmitryA  (05.11.2009 16:15:12)  [12]

Делать в соответствии с протоколом, который должен быть хорошо документирован. Но это паршивый путь, включать в программу и не только прямую поддержку таких протоколов, проблем будет очень много. Реализация протоколов может быть самописной, но сами протоколы должны быть стандартными.


 
DmitryA   (2009-11-05 16:50) [14]

Все дело в том, что работа через сокеты это на уровень ниже всяких протоколов. Это означает также и полное отсутсвие авторизации в том числе. Т.е. соединение между клиентом и сервером либо физически установлено, либо нет. И сдесь нет понятия кого-то еще (прокси), который требует авторизации по какому-то формату в зависимости от типа протокола. Я могу ошибаться, прокси работает на 7 уровне (прикладной), а сокеты на 4 (транспортный). Поэтому мне непонятно как процесс на уровне 4 может общаться с процессом на уровне 7?


 
Anatoly Podgoretsky ©   (2009-11-05 17:06) [15]

> DmitryA  (05.11.2009 16:50:14)  [14]

Это так и согласно вопросу, придется реализовывать и 7 уровень, тоже


 
DmitryA   (2009-11-05 17:12) [16]

Так как его реализовать, если соединение по нестандартному (относительно существующих протоколов) порту? Как прокси знает, что на этом порте с ним будут общаться по известному протоколу? Например, порт 4128, а протокол HTTP? И нельзя привязываться жестко к какому-то прокси, т.к. их может быть несколько и разных.


 
Демо ©   (2009-11-05 20:11) [17]


> DmitryA   (05.11.09 15:49) [10]
> Т.е. получается, без вариантов? Это как-то грустно ;(...
>  Но работают же как-то другие системы или у нас в мире настолько
> все стало единообразно, что только стандартные системы рабоают?
>


Ну как же без вариантов?
Пишешь собственный прокси, в котором уже работаешь с чужим прокси.


 
Сергей М. ©   (2009-11-06 08:19) [18]


> Как прокси знает, что на этом порте с ним будут общаться
> по известному протоколу?


Никак.
Прокси не будет обслуживать клиентов, разговаривающих с ним на неизвестном ему языке.


> порт 4128, а протокол HTTP


А вот на это существуют прокси, поддерживающие прозрачное проксирование, и маскарадные NAPT.


> нельзя привязываться жестко к какому-то прокси, т.к. их
> может быть несколько и разных


Без переделки/доработки клиента либо создания доп.софта, работающего в паре с клиентом прозрачно для него, задача не решаема


 
Anatoly Podgoretsky ©   (2009-11-06 09:55) [19]


> Например, порт 4128, а протокол HTTP?

Это уже прозрачный прокси, ему ничего не надо знать, точнее клиенту ничего не надо знать.


 
Медвежонок Пятачок ©   (2009-11-06 12:44) [20]

проще всего использовать между клиентом и сервером http протокол, а транспорт сделать на xmlhttprequest.
если браузер у юзера настроен, то все случится само собой


 
FireMan_Alexey ©   (2009-11-09 02:31) [21]

Проще использовать туннель предназначенный в протоколе НТТР.

Типа

CONNECT <имясервера>:<номер порта> HTTP/1.1
Host: <имясервера>:<номер порта>

Ждем

HTTP/1.1 200 OK

И можем слать что угодно... :)


 
Медвежонок Пятачок ©   (2009-11-09 15:41) [22]

это если он есть на прокси


 
Андрей Смирнов   (2009-12-01 08:19) [23]

Uses: WinInet;

// При помощи данной процедуры, можно установить Proxy,
// через которую будет осуществляться работа в Internet, Proxy адрес указывается в
// формате адрес : порт, например 195.43.67.33:8080.

procedure ChangeProxy(aProxy: string);
var
 PIInfo: PInternetProxyInfo;
begin
 New(PIInfo);
 PIInfo^.dwAccessType := INTERNET_OPEN_TYPE_PROXY;
 PIInfo^.lpszProxy := PChar(aProxy);
 // Список адресов, доступ к которым осуществляется не через прокси
 PIInfo^.lpszProxyBypass := PChar("");
 UrlMkSetSessionOption(INTERNET_OPTION_PROXY, piinfo,
   SizeOf(Internet_Proxy_Info), 0);
 Dispose(PIInfo);
end;

// Соединяемся с ЮРЛом с поддержкой прокси

function GetUrl(const Url: string): string;
var
 NetHandle: HINTERNET;
 UrlHandle: HINTERNET;
 Buffer: array[0..1024] of char;
 BytesRead: cardinal;
begin
 Result := "";
 NetHandle := InternetOpen(sfk_n, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

 if Assigned(NetHandle) then
 begin

   UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);

   if Assigned(UrlHandle) then
{ UrlHandle правильный? Начинаем загрузку }
   begin
     FillChar(Buffer, SizeOf(Buffer), 0);
     repeat
       Result := Result + Buffer;
       FillChar(Buffer, SizeOf(Buffer), 0);
       InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
     until BytesRead = 0;
     InternetCloseHandle(UrlHandle);
   end
   else
   begin
{ UrlHandle неправильный. Генерируем исключительную ситуацию. }
     raise Exception.CreateFmt("Cannot open URL %s", [Url]);
   end;

   InternetCloseHandle(NetHandle);
 end
 else
{ NetHandle недопустимый. Генерируем исключительную ситуацию }
   raise Exception.Create("Unable to initialize Wininet");
end;


(Без авторизации!)



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.049 c
2-1331843715
Zheksonz
2012-03-16 00:35
2013.03.22
Управление шаговым двигателем через LPT


15-1346099401
Юрий
2012-08-28 00:30
2013.03.22
С днем рождения ! 28 августа 2012 вторник


15-1343313724
waveOutXXX
2012-07-26 18:42
2013.03.22
Как правильно работать с waveOutXXX?


2-1348217897
noob_one
2012-09-21 12:58
2013.03.22
Помогите сконвертировать строку


15-1334225125
REAn
2012-04-12 14:05
2013.03.22
Компиляция BPL