Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.51 MB
Время: 0.03 c
1-1149082572
adalx
2006-05-31 17:36
2006.07.16
Компоненты


2-1151392582
fast2
2006-06-27 11:16
2006.07.16
Как в StringGrid e сделать ширину столбцов разными?


2-1151651170
VitalZ
2006-06-30 11:06
2006.07.16
Структура записей файлов NTFS


2-1151646657
Ega23
2006-06-30 09:50
2006.07.16
Ещё раз про фреймы


2-1151336611
b.o.n.d.007
2006-06-26 19:43
2006.07.16
Не понимаю циклы. Помогите.