![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Delphi и Proxy [D7, XP]
wasserman © (2006-06-28 11:45:00)Всем привет.
Облазил весь интернет в поисках материала по теме, как сделать прокси-сервер на Delphi. В большинстве случаев был предложен Alternative Proxy, но он меня не устраивает, т.к. работает с потоками памяти, а ещё хотелось бы заиметь кэш картинок и прочей дребедени...
Чур, тапками не бить - сам знаю, вопрос неоднократно поднимался. :)
wasserman (2006-06-28 15:15:00) [1]Промучался пару часов. Нашёл одно место , IP определяет. но мне надо не там, а где запрос странички идёт, дабы залогить злостного нарушителя!
wasserman (2006-06-28 14:00:00) [2]Ты забыла что общаешься с чайником в области инет-технологий ;-)
Пусик (2006-06-28 13:34:00) [3]
> а как узнать допустим если хост не существует (404)
В этом же методе
WinSock.connect(FSocket, FAddr, SizeOf(FAddr))=SOCKET_ERROR
здесь определить причину ошибки, изменить адрес хоста и запрос и подключиться уже к локальному хосту.
wasserman (2006-06-28 13:21:00) [4]а как узнать допустим если хост не существует (404) либо если просто слетел инет чтобы не заставлять юзера ждать и кинуть его скажем на server:9320 где будет запущен локальный въёб-сервер?:)
Пусик (2006-06-28 13:14:00) [5]
> а ещё можно узнать как можно залочить некоторые урлы типа
> neznakomka.ru?
Я думаю, что вот здесь - procedure TClient.Connect(ARequest: string);
Надо просто проверить имя удаленного хоста, либо запрос и добавить
строки:
try
FAddr.sin_port := htons(StrToInt(ARemotePort));
if (<Здесь проверка условия>) or (WinSock.connect(FSocket, FAddr, SizeOf(FAddr))=SOCKET_ERROR)
then FSocket:=INVALID_SOCKET;
except
end;
wasserman (2006-06-28 12:49:00) [6]у меня задача-то собственно была ограничить от использования и-нета челов, которые не работают с определёнными файлами некоторое время :)
пасиба.
а ещё можно узнать как можно залочить некоторые урлы типа neznakomka.ru?
Пусик (2006-06-28 12:44:00) [7]
> wasserman (28.06.06 12:38) [10]
> В твоём примере FSI это что-то явно непонятное....
Да просто структура...
Описана так:
TSocketInfo=record
FClientHost: String;
FClientIP: String;
FClientPort: String;
FServerHost: String;
FServerIP: String;
FServerPort: String;
FQuery: String;
FRecvFromClient: Cardinal;
FSentToServer: Cardinal;
FRecvFromServer: Cardinal;
FSentToClient: Cardinal;
FType: TTypeClient;
Ну да это не имеет значения. Все равно свое будешь делать.
wasserman (2006-06-28 12:38:00) [8]В твоём примере FSI это что-то явно непонятное....
Пусик (2006-06-28 12:35:00) [9]Да, и не забудь, что пример написан в консольном приложении. Если нужно будет перенести в VCL-Application, придется досконально изучить код и поправить во избежание утечек памяти.
wasserman (2006-06-28 12:33:00) [10]Спасибо. Но я уже пробовал написать свой, чисто - с "нуля". Там возникала проблема чтения из серверного сокета (делал на Internet'овских компонентах). То есть читает читает, раз - виснет на "пустой" строчке (типа там \r\n должно быть, только то ли нет, то ли я идиот...)
Пусик (2006-06-28 12:31:00) [11]А лучше изучи пример, и напиши свой.
Автор, кстати - Polevi, периодически появляется здесь.
Пусик (2006-06-28 12:30:00) [12]
> И ещё деталька - я никак не могу понять в каком месте можно
> определить ip адрес клиента который сидит??
Ну это тебе придется разбираться самому.
Детально разбирай и ищи.
Например, введи структуру дополнительно в классе TClient или в TIntenalClient,
в
procedure TAcceptThread.Execute; при акцептировании соединения определяй нужные параметры по полученному сокету.
Вот набросок:
ClientSocket:=accept(FListenSocket, @FAddr, @Len);
try
GarbageCollect;
if ClientSocket<>INVALID_SOCKET then
begin
InternalClient:=TInternalClient.Create;
InternalClient.FSI.FType := tcInternal;
Len1:=sizeof(FAddr);
GetPeerName(ClientSocket,FAddrClient,Len1);
InternalClient.FSI.FClientIP := Inet_ntoa(FAddrClient.sin_addr);
he:=GetHostByName(PChar(InternalClient.FSI.FClientIP));
if Assigned(he) then
begin
InternalClient.FSI.FClientHost := he^.h_name;
InternalClient.FSI.FClientPort :=IntToStr(FAddrClient.sin_port);
end;
wasserman (2006-06-28 12:24:00) [13]да нет... я не про то
просто когда я пытаюсь выполнить поиск он полчаса грузит ../i/чего-то-там.gif а потом говорит Stack Owerflow
в mail.ru этого нет, зато съедает css...
И ещё деталька - я никак не могу понять в каком месте можно определить ip адрес клиента который сидит??
Пусик (2006-06-28 12:19:00) [14]
> но вот попа - яндекс он не распознаёт. вообще....
Не Яндекс, а конкретно ya.ru
Тебе придется переписать в примере кусок, определяющий целевой хост и запрос, в случае, если в запросе используется протокол HTTP/1.0, заменить запрос таким образом, например:
GET http://myhost.ru/index.htmlHTTP/1.0 на
GET /myhost.ru/index.html HTTP/1.0
wasserman (2006-06-28 12:05:00) [15]так. это разобрался...
но вот попа - яндекс он не распознаёт. вообще....
wasserman (2006-06-28 12:02:00) [16]Просмотрел. Врубиться не могу - как его теперь биндануть к 192.168.0.1:3128?
Пусик (2006-06-28 11:53:00) [17]http://forum.sources.ru/index.php?showtopic=135857