Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Сокеты 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.068 c
15-1352355933
Smailer
2012-11-08 10:25
2013.03.22
Непростые но интересные вопросы.


15-1347354383
xayam
2012-09-11 13:06
2013.03.22
SVG


2-1330002674
Den
2012-02-23 17:11
2013.03.22
Вместо TWebBrowser использовать FireFox?


3-1286090959
shadowrun
2010-10-03 11:29
2013.03.22
Ламер и dbexpmys.dll


4-1258417192
мурзик
2009-11-17 03:19
2013.03.22
Как определить что за изменения произошли в директории?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский