Сайт о телевидении

Сайт о телевидении

» » Как сделать свой proxy сервер. Создаём собственный прокси

Как сделать свой proxy сервер. Создаём собственный прокси

Добрый день. На моем сайте открылся партнерский магазин от сайта gold-nm.ru и по случаю открытия партнер предлагает всем пользователям сайта скидку на товары в размере 10% (используйте промокод 84DE22AD1A164230), для того чтобы ознакомиться с перечнем товаров перейдите по ссылке — магазин. Но это еще не все изменения, скоро откроется еще один магазин. Подписывайтесь на обновления, чтобы узнать об этом вовремя;)

Теперь немного предыстории. Один мой товарищ переехал в Чехию на обучение и подкинул мне идею для очередной темы статьи. Суть проблемы была в том, что Steam отказывается принимать на счет рубли, если пользователь находится в Европе/Америке. Логичным решением было воспользоваться прокси сервером. Но прокси сервер так же помогает обойти блокировку сайтов на работе, к примеру vk.com:). Достаточно настроить сервер у себя дома, а на работе подключиться к нему. Для большего удобства можно для вашего компьютера. Немного изучив вопрос, я понял что для настройки простого сервера нужно потратить от силы пять минут:) И сейчас я расскажу вам, как это сделать.

Инструкция

  1. Нам понадобится бесплатный прокси-сервер под названием 3proxy . Для этого переходим на официальный сайт . И качаем самую свежую версию, я использую 0.8, вам тоже рекомендую именно ее.

  2. Создаем текстовый файл и меняем ему имя на 3proxy.cfg.
  3. Открываем файл в блокноте или любом другом текстовом редакторе и записываем в него следующие три строчки:

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

  4. Запускаем программу. Чтобы подключиться к прокси серверу используйте свой внешний IP-адрес() и порт 3128 (используется по-умолчанию).

Это простейший сервер, который удовлетворит потребности большинства пользователей. Для более точной настройки сервера изучите файл 3proxy.cfg.sample , находящийся в папке cfg в архиве с программой.

На этом всё. Надеюсь эта статья оказалась вам полезной, нажмите одну из кнопок ниже, чтобы рассказать о ней друзьям. Также подпишитесь на обновления сайта, введя свой e-mail в поле справа или подписавшись на группу в Вконтакте.

Спасибо за внимание!

Лайфхакер уже рассказывал о том, как купить виртуальный сервер (VPS) и для обхода блокировок в интернете. Но VPN работает для всех программ, которые имеют доступ в интернет. Если вы хотите, чтобы трафик перенаправлялся на другой сервер только в браузере, создайте собственный .

Учитывая запрет анонимайзеров и VPN, который в любой момент может начать применяться на практике, наличие собственного прокси-сервера станет гарантией вашей свободы в интернете.

Как создать прокси

О том, как выбрать и купить VPS, подробно рассказано в материале о поднятии VPN. Не будем повторяться и перейдём сразу к настройке прокси-сервера.

Как запустить прокси на отдельных сайтах

Чтобы прокси-сервер использовался только на определённых сайтах, установите в браузере расширение FoxyProxy.

Откройте настройки расширения и нажмите Add New Proxy. На вкладке Proxy Details введите IP-адрес и номер порта, которые вы прописывали ранее в Putty. Отметьте опцию SOCKS Proxy.

Перейдите на вкладку URL Patterns и добавьте маски сайтов, на которых должны использоваться прокси. Чтобы добавить маску сайта, нажмите Add New Patterns, введите его адрес со звёздочками по обеим сторонам: например, *site.com*.

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

Можно не создавать список в FoxyProxy, а использовать расширение « ». В нём есть перечень «Антицензорити», который охватывает большую часть заблокированных в России сайтов.

Нажмите на значок расширения на панели задач, откройте вкладку «Свои прокси». Отметьте пункт «Использовать СВОИ прокси», введите IP-адрес и номер порта.

Как сохранить сессию

Чтобы прокси-сервер работал, необходимо постоянно запускать сессию Putty. Можно сохранить параметры, чтобы для подключения оставалось только ввести пароль.

Запустите Putty. Настройте подключение, как показано выше, и перейдите на вкладку Data в разделе Connection. Пропишите имя для автоматической авторизации: обычно это root, но хостер может назначить в письме другое.

Перейдите на вкладку Session, введите любое название в поле Saved Sessions и нажмите Save.

В списке сессий сохранится ваше подключение.

При следующем запуске Putty выберите его, нажмите Load, затем - Open для установления соединения и введите пароль от сервера, который прислал хостер в письме.

Я постараюсь в этой статье подробно описать то, как настроить прокси-сервер и с его помощью на стороне клиента подключаться к сети интернет. Программа, на которой будет осуществляться демонстрация этого, называется WinProxy (v.2.1R2f).

Прокси-сервер работает по принципу, показанному на рис. 1.

Рис. 1. Принцип работы прокси-сервера

Итак, после установки WinProxy, запускаем его. При первом запуске, появляется мастер настройки, который будет вести пошагово до конца базовой настройки WinProxy. Выберите тот IP адрес, через который вы будете предоставлять доступ к сети Интернет и нажмите «Add>>» (рис. 2).


Рис. 2. Настройка прокси-сервера

На рис. 2 Internal IP Addresses указывает на количество локальных адресов, через которые можно предоставлять доступ к сети Интернет. После выбора IP адреса переходим к следующему шагу.


Рис. 3. Настройка прокси-сервера

На рис. 3 отмечаем те протоколы, которые будут предоставляться пользователям (HTTP - для открытия интернет страничек, передачи файлов; FTP - для передачи файлов). Переходим к следующему шагу.


Рис. 4. Настройка прокси-сервера

На рис. 4 устанавливается порт, по которому будет вещаться протокол HTTP через прокси-сервер (он нужен для настройки прокси-сервера на клиенте).


Рис. 5. Настройка прокси-сервера

В следующем шаге производиться настройка почты (рис. 5). После настройки почты, указываем, нужно использовать Socks или нет, например, для использования Icq клиентом (рис. 6).


Рис. 6. Настройка прокси-сервера

В следующем шаге (рис. 7) указываем, использовать или нет модемное соединение.


Рис. 7. Настройка прокси-сервера

Если нет, то шаг на рис. 8 пропускается, если да то нужно указать модем (рис. 8).


Рис. 8. Настройка прокси-сервера

Шаг на рис. 9 позволяет использовать каскад прокси-серверов, например, если будущий прокси-сервер,


Рис. 9. Настройка прокси-сервера

также использует прокси-сервер, а не прямое соединение. В этом случае нужно указать настройки вашего прокси-сервера.



Следующий шаг (рис. 10) дает возможность выставлять на прокси-сервер пароль, который нужно будет вводить каждый раз при смене каких-либо настроек.


Рис. 11. Настройка прокси-сервера

Следующий шаг (рис. 11) дает возможность вести лог соединений (в лог файл записываются все соединения пользователей, скажем так, там отражается, кто куда ходил, что смотрел).


Рис. 10. Настройка прокси-сервера

Последний шаг (рис. 12) дает возможность включать или выключать показ соединения клиента в главном окне программы, например, соединения через socks на рис. 13.


Рис. 13. Настройка прокси-сервера

После настроек откроется текстовый файл, в котором будут прописаны все настройки вашего прокси-сервера, с помощью него клиенты смогут настроить свой компьютер, чтобы можно было пользоваться интернетом. Этот текстовый файл можно открыть в любое время перейдя в меню программы File -> Show Client Configuration.

Также можно настроить программу и не с помощью мастера, а перейдя в меню программы File -> Advanced Properties. На вкладке Users, можно произвести, кроме того, дополнительные настройки. На этой вкладке можно ограничить, некоторых пользователей, а также позволять распределять Интернет ресурс только на конкретные IP адреса или IP адрес (см. рис 14, 15).


Рис. 14. Настройка прокси-сервера


Рис. 15. Настройка прокси-сервера

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


Рис. 16. Настройка прокси-сервера (несколько сетей)

На этом особенности настройки прокси-сервера можно считать завершенными.

Теперь разберем то, как на клиенте настроиться под прокси-сервер. Все довольно просто, открываем браузер, например, Internet Explorer заходим в меню программы «Сервис»-> «Свойства обозревателя…». Переходим на вкладку подключение, т.к. мы раздаем интернет по локальной сети то переходим на «Настройка LAN» (рис. 17).


Рис. 17. Настройка прокси на клиенте

В появившемся окне прописываем параметры прокси-сервера, и так на каждой машине, использующей данный прокси-сервер (рис. 18).


Рис. 18. Настройка прокси на клиенте

И притом везде соблюдаем аналогию, например, для настройки браузера Opera, нужно пройти по пути «Инструменты» ->«Настройки» -> вкладка «Дополнительно» ->«Сеть» -> «Прокси-серверы» и там производится прописка прокси-сервера. Пример настройки прокси-сервера в менеджере закачек здесь.

Также есть еще программы, чтобы организовать прокси-сервер, например, Usergate. Могу добавить, что в UserGate можно делать привязку к mac-адресу, ограничить скорость соединения, что WinProxy не наблюдается (по крайней мере, в приведенной версии, которую я использовал пару лет назад).

  • Вперёд >
Нужен прокси? Где же его взять, не редко возникает такая необходимость. Пользователи интернета не редко и в повседневной работе замечают это. Для чего же может понадобиться скрытие ip адреса:

Соблюдение вашей анонимности. (Бывает полезным, если вы используете интернет для определённых отраслей бизнеса).

Парсируя поисковую систему вы получили бан. Например, “Вы робот, частый вопрос поисковой системы Яндекса?”. Или Rapidshara.com мешает спокойно пользоваться её услугами.

Вот несколько вариантов найти прокси (socks) сервера : сделать его покупку, самостоятельно парсировать сервер, или самим создать. Первые 2 варианта не особо подходят, т.к. покупая прокси, мы не знаем пишется ли логин(так же можно потерять свои личные данные, icq или почту).

Прокси которые находятся в открытом доступе – public, держаться как правило не более суток. Так что думаю, 3 вариант более предпочтителен, а точнее, просто создадим свой сервер и бесплатно. Для того, что бы выполнить эту задачу, нужно выполнить несколько не сложных шагов.

1) Открываем удобную для вас поисковую систему, и ищем хостинг с поддержкой ssh – не дорогой. В русском сегменте легко найдёте, около десятка хостеров, которые всего за 1 доллар продадут хостинг с поддержкой ssh. Заграничный ip адрес, обойдётся дороже около $5 в месяц. Но если нужна совсем халява, то существует множество хостингов, которые вам предоставят тестовый вариант бесплатно. Необходимо просто хорошо поискать.

2) В итоге у вас есть аккаунт с ssh, пока забываем про него. Для дальнейшего шага нам потребуется несколько софта для работы с ssh. Если вы пользовались когда-нибудь командной строкой в системах nix, знаете о putty, если же не встречались, то это не страшно, просто скачиваем программу.

3) Запускаем putty и выполняем настройку для нашего сервера: В HostName вводим IP адрес вашего сервера, или домена. В поле Port - обычно 21, он по умолчанию используется для ssh. На вкладке Connection -> Ssh -> Tunnels, (Add new forwarded port) - нужно добавить новый порт (. Source Port выбираем порт который у нас на компе будет использовать прокси. Dynamic нужно выбрать обяхзательно и кликаем по кнопке add. В итоге в Forwarded Port вы должны увидеть запись D81.

4) Ищем и кликаем по кнопке open. В чёрном окошке для начала вводим ваши логин, после разумеется пароль(если при процессе ввода пароль ничего не полявиться, то это нормально).

5) Ну в принципе готово – прокси по адресу 127.0.0.1:81 ваш. Можете пожинать плоды вашей работы. Причём способ если не во всех случаях бесплатен, то как минимум всегда экономичен.

Да и ещё – как только откроете ssh сессию, в настройках прокси браузера, нужно занести localhost (127.0.0.1) и порт и не в HTTP-Proxy а именно в SOCKS5.

Позволят ускорить работу с SEO софтом и социальными сетями.

Теперь изучим, как можно создать HTTP прокси-сервер. Прокси-сервер - это посредник между пользователем и Интернетом. Допустим, что в вашей локальной сети есть сервер, который подключен выделенным каналом к Интернету. Чтобы все компьютеры получили доступ, нужно установить на сервере посредника, через который локальные компьютеры будут обращаться в глобальную сеть.

Прокси-сервер может маскировать IP-адреса, и в Интернете будет виден только адрес сервера, потому что запросы будут идти от его имени. Помимо этого, современные серверы могут кэшировать информацию и таким образом экономить входящий трафик.

В этой главе мы создадим прокси-сервер, который будет маскировать адрес (все запросы будут идти от имени сервера), но без возможности кэширования. Таким образом, связь будет как бы прозрачной.

Итак, перейдем к практике и изучим, как все работает изнутри. Для начала нужно определиться с используемой технологией. Что выбрать - блокировки, ожидания через select или события Windows? В нашей программе, когда пользователь запросит загрузить какой-либо сайт, мы должны будем получить этот сайт от сервера и передать его пользователю. Это отнимет много времени, и при использовании событий другие пользователи в данный момент работать не смогут.

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

Теперь переходим к реализации. Создайте новый проект. На форме нам понадобятся три поля ввода:

Порт, на котором будет работать наш сервер и ожидать подключения со стороны клиента; порт внешнего прокси-сервера, если наш должен будет перенаправлять запросы другому серверу. Таким образом, мы сможем строить цепочку из разных прокси-серверов;

Адрес внешнего прокси-сервера.

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

Пример главной формы будущей программы показан на рис. 5.9.

Рис. 5.9. Форма будущего прокси-сервера

Загрузку сетевой библиотеки WinSock поместим на событие OnCreate для главной формы:

procedure THTTPProxyForm.FormCreate(Sender- TObject). var wData- WSADATA: begin if WSAStartup(MAKEWORDd.l). wData) <> 0 then begin MessageBox(0. "He могу загрузить WinSock". "Ошибка". 0): exit:

End: end:

По нажатии кнопки Запуск нужно запустить прокси-сервер. Для этого мы создадим отдельный поток, и в нем будем ожидать подключения от клиента, чтобы не задерживать работу главной формы. Блокировок в программе не будет.

Procedure THTTPProxyForm.bnStartClick(Sender: TObject). var st: TServerThread: begin st:= TServerThread.Create(true). st iLocal Port:" StrToIntDef(edPort.Text. 8088): st.iExtProxyPort -= StrToIntDef(edExtProxyPort Text. 8080): st.sExtProxyAddr:= edExtProxyAddr.Text: st.Resume: end:

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

Теперь посмотрим на реализацию потока сервера. Для его создания выполните команду меню File New Other (для Delphi 6 и меньшей версии достаточно выбрать File New). Перед вами откроется диалоговое окно задания создаваемого элемента. Выберите Thread Object и нажмите ОК. Должно появиться диалоговое окно ввода имени потока. Введите TServerThread и нажмите ОК.

Полный исходный код (только без знакомых нам процедур проверки сообщений TestFuncError и TestWinSockError) вы можете увидеть в листинге 5.10.

Листинг 5.10. Код потока TServerThread

Unit ServerThreadUnit. interface uses Classes, winsock, windows; type TServerThread = class(TThread) private {Private declarations} protected procedure Execute: override: public i Local Port. i ExtProxyPort:Integer; sExtProxyAddr:Stri ng: end: implementation uses ClientThreadUnit:

procedure TestWinSockError(S:String): begin // Код этой процедуры нам знаком, поэтому урезан для экономии места

function TestFuncErrordErr:Integer: FuncName:String):Boolean; begin // Код этой функции нам знаком, поэтому урезан для экономии места

End; procedure TServerThread.Execute;

Листинг 5.10 (продолжение) var sServerListen. stClientSocket: TSOCKET: local-addr- sockaddMn: ct: TCIientThread; begi n

// Создание сокета

SServerListen:= socket(AF_INET. SOCK_STREAM, 0);

if SServerListen = INVALID_SOCKET then begin MessageBox(0. "Ошибка создания сокета". "Ошибка". 0): exit:

// Заполнение структуры адреса localaddr.sin_addr.s_addr:= htonl{INADDR_ANY): localaddr.sin_family:= AF_INET; localaddr.sin_port:= htonsdLocal Port):

// Связывание сокета с локальным адресом

If TestFuncError(bind(sServerListen. localaddr. sizeof(localaddr)) "bind") then exit:

// Запустить прослушивание

If TestFuncError(listen(sServerListen. 4), "Listen") then exit:

// Цикл обработки подключений от клиента

while true do begin // Принять соединение

StClientSocket:= accept(sServerListen, nil. nil): if StClientSocket = INVALID.S0CKET then continue: i

// Создать поток для общения с клиентом ct:= TClientThread.Create(true): ct.stClient:" StClientSocket: ct iExtProxyPort:= iExtProxyPort: ct sExtProxyAddr:= sExtProxyAddr; ct Resume:

End: end; end.

В разделе pub! i с добавлены три переменные: i Local Port, iExtProxyPort типа Integer и sExtProxyAddr, имеющая тип String. Мы уже пользовались этими переменными, когда рассматривали код создания потока, здесь же видно, как они объявлены.

Основной код серверного потока расположен в процедуре Execute. Сначала создается сокет и запускается прослушивание подключений на порте, указанном пользователем.

В бесконечном цикле while принимаются входящие соединения. Если получен корректный сокет, то создается еще один поток типа TClientThread. В этом потоке будет происходить непосредственное общение между клиентом и сервером. Поток будет выступать для клиента посредником для доступа к веб-страницам. Код потока TClientThread приведен в листинге 5.11.

Листинг 5.11. Поток, выступающий посредником между клиентом и web

Unit ClientThreadUnit.

i nterfасе uses

Classes, winsock. sysutils. windows: type TClientThread = class(TThread) private {Private declarations} protected procedure Execute: override; public iExtProxyPort: Integer; sExtProxyAddr: String: stClient: TSocket: end:

implementation {TClientThread} function LookupName(name: String): TInAddr; begin // Функция определения имени, которая нам знакома

// Функция отправки строки

Procedure SendStr(s: TSocket: str: String): begin TempStr:= str+#13+#10: CopyMemory(@sRecvBuff. PCharCTempStr). Length(TempStr)); send(s. sRecvBuff. Length(TempStr). 0); end; procedure TClientThread.Execute: var Buff: array of char: iPort: Integer: sRequest. sHost: String: server_addr: sockaddMn: продолжение &

Листинг 5.11 (продолжение) sock_server- TSocket: iMode. iSize: Integer-rfds: TFDSET. begin //////////////////////////// // Считывание заголовка //////////////////////////// RecvCstClient. Buff. 1024. 0):

SRequest:= String(Buff).

// Нет заголовка if sRequest = "" then begin CIoseSocket(stCl i ent). exit, end:

////////////////////////////

// Определяем адрес сервера и порта

//////////////////////////// sHost:= Copy (sRequest. PosCHost: ". sRequest). 255): Delete(sHost. Pos(#13. sHost), 255); Delete(sHost. 1, 6); iPort:= St rToIntDef(Copy (sHost. PosC:". sHost)+l. 255). 80): Delete(sHost. PosC:". sHost). 255):

// Если не найден host, то ошибка

If sHost = "" then. begin SendStr(stClient. "HTTP/1.0 400 Invalid header received from browser"); CIoseSocket(stCli ent); exit: end;

// Если есть внешний "проксик", то перенаправляем на него

If sExtProxyAddr<>" then begin iPort:= iExtProxyPort; sHost:= SExtProxyAddr; end:

sock_server-:= socket(AF_INET. S0CK_STREAM. 0): // Ищем прокси-сервер

Server_addr.sin_addr.s_addr:= htonl(INADDR_ANY): server_addr sin_family:= AF_INET: server_addr.sin_port .= htons(iPort): server_addr.sin_addr:= LookupName(sHost); 1

// Соединение с сервером

If connect(sock_server. server_addr. sizeof(server_addr)) = SOCKETJRROR then begin SendStr(stClient. "404 Host Not Found"); exit; end; iMode:= 1: setsockopt(sock_server. IPPR0T0_TCP. TCPJODELAY. @iMode. sizeof (integer)).

// Перенаправляем запрос серверу или другому "проксику" send(sock_server. buff, strlen(buff).0):

// Теперь работаем посредником между клиентом и сервером. // передавая запрошенные данные while true do begin // Добавляем сокеты в набор для ожидания FD_ZERO(rfds): FD_SET(stClient, rfds): FD_SET(sock_server. rfds); if (select(0. Orfds. nil. nil. ml) < 0) then exit; // Если пришел запрос от клиента. // то перенаправляем серверу if (FD_ISSET(stClient. rfds)) then begin iSize = recv(stClient. buff, sizeof(buff). 0); if iSize=-l then break; Send(sock_server. buff. iSize. 0); continue: end:

// Если пришли данные от сервера.

// то перенаправляем клиенту

If (FD_ISSET(sock_server, rfds)) then begin iSize:= recv(sock_server, buff. sizeof(buff). 0):

// Сервер уже все выслал if iSize = 0 then exit:

Листинг 5.11 (продолжение) SencKstClient. buff. iSize. 0): continue:

End; end: CloseSocket(stClі ent): CloseSocket(sock_server): end: end.

Для прокси-сервера в потоке TClientThread спрятано самое интересное, и сейчас мы это подробно рассмотрим. Единственное, что упущено в этом листинге, - уже знакомая нам функция LookupName.

Итак, когда клиент подключился к прокси-серверу, он посылает стандартный HTTP-запрос на получение какого-либо файла. Мы считываем этот заголовок с помощью функции recv. Заголовок выглядит следующим образом:

GET http://VAAo.vr-onl1ne.rU/HTTP/l.0 Accept: image/gif. image/x-xbitmap. image/jpeg. */* Accept-Language: ru User-Agent: Mozilla/4.0 (compatible: MSIE 6.0: windows NT 5.2: .NET CLR 1.1.4322) Host: www.vr-online.ru Proxy-Connection- Keep-Alive

Пока не будем вникать в суть запроса и содержащихся здесь команд, для нас сейчас главное - это строка host. В ней находится адрес сервера, с которого нужно получить данные и вернуть клиенту. В данном случае это www.vr-onlin.ru. Адрес известен, осталось выяснить порт. По умолчанию веб-серверы работают на порте 80, но если не так, то адрес веб-сервера будет указан следующим образом: www.vr-online.ru:Port. После двоеточия указывается номер порта, и мы должны учитывать этот нюанс.

Итак, получив заголовок, начинаем выбирать из него имя хоста:

SHost:= Copy(sRequest, Pos("Host: ". sRequest). 255): Delete(sHost. Pos(#13. sHost). 255); Delete(sHost. 1. 6);

Теперь отделяем номер порта, если он указан:

IPort:= StrToIntDef(Copy(sHost. PosC:". sHost)+l. 255). 80); Delete(sHost. PosC:". sHost), 255):

Если порт не указан, то функция StrToIntDef выдаст ошибку и возвратит значение, указанное по умолчанию, то есть 80.

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

SendStr(stClі ent. "HTTP/1.0 400 Invalid header received from browser");

После отправки ошибки закрываем сокет и выходим из потока.

Теперь проверяем: если указан внешний "проксик", то заменяем адрес и порт сервера на параметры внешнего прокси-сервера. В этом случае мы просто должны переслать на этот сервер запрос, полученный от клиента.

В принципе, если есть внешний прокси-сервер, то не было смысла определять адрес сервера. Но я делаю это в любом случае и вам советую, потому что в будущем может понадобиться переадресация. Например, если пользователь запрашивает страницу с сайта www.sex.ru, то наш прокси-сервер определит это и сможет переадресовать запрос на другой сервер. Для этого достаточно поменять значение переменной sHost и немного подкорректировать запрос, который поступил от клиента.

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

Создав новый сокет и подключившись к серверу, мы сразу же переводим его в асинхронный режим таким образом:

IMode:= 1: setsockopt(sock_server. IPPROTOJCP. TCP_NODELAY. OiMode. sіzeof(integer)):

Функция setsockopt в данном случае схожа по своему назначению с іoctl socket, рассмотренной нами в главе 4. Она переводит сокет в более быстрый режим работы, который позволяет не ожидать и не накапливать данные, а сразу же принимать и пересылать их. Таким образом мы минимизируем задержки, а накапливанием занимается сервер или клиент.

После перевода сокета в нужный режим перенаправляем веб-серверу (или следующему прокси-серверу) запрос от клиента и запускаем бесконечный цикл. Этот цикл и будет посредником. Здесь ожидаются данные от клиента и сервера и пересылаются друг другу. Если пришли пустые данные, то это значит, что соединение завершено, и цикл прерывается. Все открытые сокеты при выходе из процедуры закрываются.

Как видите, прокси-сервер - это всего лишь посредник, который пересылает пакеты между клиентом и сервером. Попробуйте добавить возможность просмотра того, что пересылается между клиентом и сервером, и вы увидите, что на запрос клиента, сервер передает только текстовое содержимое документа. После этого браузер разбирает полученный документ, и если находит картинки или другую дополнительную информацию (звуковые файлы, flash-ролики и т. д.), то идет дополнительный запрос на получение этих данных. Таким образом, браузер получает только те данные, которые ему нужны, и может экономить трафик.

Хочу также обратить ваше внимание на то, что в качестве номеров портов в исходном коде по умолчанию установлено значение 8080. Это связано с тем, что моя сеть настроена через прокси-сервер. Если вы используете DialUp, то в качестве порта внешнего "проксика" и адреса нужно указать пустые строки.

Для тестирования примера запустите нашу программу и сервер. Затем откройте Internet Explorer (или другой браузер) и настройте его на использование прокси-сервера. Для этого выполните команду меню Сервис Свойства обозревателя, и в появившемся диалоговом окне (рис. 5.10) перейдите на вкладку Подключение.

Рис. 5.10. Настройка браузера

Нажмите кнопку Настройка сети, и перед вами откроется новое диалоговое окно (рис. 5.11).


Рис. 5.11. Настройка прокси-сервера

В области Прокси-сервер установите флажок Использовать прокси-сервер и укажите адрес и порт. Если вы запускаете сервер на своем локальном компьютере, то можно указать 127.0.0.1, но я рекомендую указать реальный адрес, чтобы пример точно работал.

ПРИМЕЧАНИЕ ---1Исходный код рассмотренного здесь примера находится на компакт-диске в каталоге 5оигсе5\сп05\Н"ГТРРгоху.