Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Проблема с соксами в потоках


Автор: fack00 25.5.2010, 13:14
цель программы: даем список сокс5 и получаем многопоточно страницы (в примере просто определяем ип адресс через myip.ru)


Код

constructor TNewThread.Create;
begin
  inherited Create(True);
  FreeOnTerminate := True;
  FIdHTTP := TIdHTTP.Create(nil);

  FIdIOHandlerStack:=TIdIOHandlerStack.Create;
  FIdSocksInfo:=TIdSocksInfo.Create;

  FIdHTTP.IOHandler:=FIdIOHandlerStack;
  FIdIOHandlerStack.TransparentProxy:=FIdSocksInfo;

  FIdSocksInfo.Authentication:=saNoAuthentication;
  FIdSocksInfo.Version:=svSocks5;
..........
end;

procedure TNewThread.Execute;
var str:string;
begin
str:=FIdHTTP.Get('http://www.myip.ru/get_ip.php?loc=');
....
end;


Такой код работает почему-то криво, а именно страница получается минуя сокс5, то есть с моего ип адреса.

Методом тыка нашел проблему:
Код

//заменяем
FIdSocksInfo:=TIdSocksInfo.Create;
//на
FIdSocksInfo:=Form1.IdSocksInfo1.Create;

// то есть создаем FIdSocksInfo в потоке из компонента (IdSocksInfo1) на форме (Form1)

Так все работает нормально (страница получается через сокс5).

Это конечно же неправильно, т.к. при создании множества потоков все это дело падет крахом... (критические секции не предлагать)

В чем может быть проблема?

P.S.
1) Потоку данные сокса (ip:port) передаются верно.
2) Сокс точно Socks5, а не иного вида.

Автор: Matematik 27.5.2010, 12:57
В Indy9 так
Код

  IdHTTP1 := TIdHTTP.Create(nil);
  IdSocks := TIdSocksInfo.Create(IdHTTP1);
  IdIOHandlerSocket1 := TIdIOHandlerSocket.Create(nil);  

  IdIOHandlerSocket1.SocksInfo := IdSocks;
  IdHTTP1.IOHandler := IdIOHandlerSocket1;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)