Текущий архив: 2006.07.16;
Скачать: CL | DM;
ВнизDelphi и Proxy Найти похожие ветки
← →
wasserman (2006-06-28 11:45) [0]Всем привет.
Облазил весь интернет в поисках материала по теме, как сделать прокси-сервер на Delphi. В большинстве случаев был предложен Alternative Proxy, но он меня не устраивает, т.к. работает с потоками памяти, а ещё хотелось бы заиметь кэш картинок и прочей дребедени...
Чур, тапками не бить - сам знаю, вопрос неоднократно поднимался. :)
← →
Пусик © (2006-06-28 11:53) [1]http://forum.sources.ru/index.php?showtopic=135857
← →
wasserman (2006-06-28 12:02) [2]Просмотрел. Врубиться не могу - как его теперь биндануть к 192.168.0.1:3128?
← →
wasserman (2006-06-28 12:05) [3]так. это разобрался...
но вот попа - яндекс он не распознаёт. вообще....
← →
Пусик © (2006-06-28 12:19) [4]
> но вот попа - яндекс он не распознаёт. вообще....
Не Яндекс, а конкретно ya.ru
Тебе придется переписать в примере кусок, определяющий целевой хост и запрос, в случае, если в запросе используется протокол HTTP/1.0, заменить запрос таким образом, например:
GET http://myhost.ru/index.html HTTP/1.0 на
GET /myhost.ru/index.html HTTP/1.0
← →
wasserman (2006-06-28 12:24) [5]да нет... я не про то
просто когда я пытаюсь выполнить поиск он полчаса грузит ../i/чего-то-там.gif а потом говорит Stack Owerflow
в mail.ru этого нет, зато съедает css...
И ещё деталька - я никак не могу понять в каком месте можно определить ip адрес клиента который сидит??
← →
Пусик © (2006-06-28 12:30) [6]
> И ещё деталька - я никак не могу понять в каком месте можно
> определить 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;
← →
Пусик © (2006-06-28 12:31) [7]А лучше изучи пример, и напиши свой.
Автор, кстати - Polevi, периодически появляется здесь.
← →
wasserman (2006-06-28 12:33) [8]Спасибо. Но я уже пробовал написать свой, чисто - с "нуля". Там возникала проблема чтения из серверного сокета (делал на Internet"овских компонентах). То есть читает читает, раз - виснет на "пустой" строчке (типа там \r\n должно быть, только то ли нет, то ли я идиот...)
← →
Пусик © (2006-06-28 12:35) [9]Да, и не забудь, что пример написан в консольном приложении. Если нужно будет перенести в VCL-Application, придется досконально изучить код и поправить во избежание утечек памяти.
← →
wasserman (2006-06-28 12:38) [10]В твоём примере FSI это что-то явно непонятное....
← →
Пусик © (2006-06-28 12:44) [11]
> 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:49) [12]у меня задача-то собственно была ограничить от использования и-нета челов, которые не работают с определёнными файлами некоторое время :)
пасиба.
а ещё можно узнать как можно залочить некоторые урлы типа neznakomka.ru?
← →
Пусик © (2006-06-28 13:14) [13]
> а ещё можно узнать как можно залочить некоторые урлы типа
> 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 13:21) [14]а как узнать допустим если хост не существует (404) либо если просто слетел инет чтобы не заставлять юзера ждать и кинуть его скажем на server:9320 где будет запущен локальный въёб-сервер?:)
← →
Пусик © (2006-06-28 13:34) [15]
> а как узнать допустим если хост не существует (404)
В этом же методе
WinSock.connect(FSocket, FAddr, SizeOf(FAddr))=SOCKET_ERROR
здесь определить причину ошибки, изменить адрес хоста и запрос и подключиться уже к локальному хосту.
← →
wasserman (2006-06-28 14:00) [16]Ты забыла что общаешься с чайником в области инет-технологий ;-)
← →
wasserman (2006-06-28 15:15) [17]Промучался пару часов. Нашёл одно место , IP определяет. но мне надо не там, а где запрос странички идёт, дабы залогить злостного нарушителя!
Страницы: 1 вся ветка
Текущий архив: 2006.07.16;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.008 c