Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.08.2011, 21:02   #1
Once
Пользователь
 
Регистрация: 21.08.2011
Сообщений: 14
По умолчанию Грамотный подход к работе с прокси :)

Начал разбираться с сетевыми приложениями на Delphi и в целях практики хочется написать небольшой проект, одним из кусков проекта будет работа с прокси и хотелось бы отработать этот кусок.. понять как правильно и без косяков ) Собственно вопрос к знатокам:
Как наиболее грамотно подойти к этому вопросу, чтобы по возможности обработать все исключения, избежать ошибок и падений. Сразу скажу, что с Delphi знаком не на очень высоком уровне и любая полезная и действительно правильная инфа, основанная на собственном опыте пойдёт будет полезна ) Собственно вот с чего я начал:

PHP код:
procedure TForm1.Run_BtClick(SenderTObject);
var
  
parseString;
  
IdHTTPTIdHTTP;
  
IdSocksInfoTIdSocksInfo;
  
IdSSLIOHandlerSocketOpenSSLTIdSSLIOHandlerSocketOpenSSL;
begin
  IdHTTP
:= TIdHTTP.Create;
  
IdHTTP.HandleRedirects:= true;
  
parse:= '';
  try
    if (
Pos(ProxyType_CB.Text'SOCKS') <> 0then begin
      IdSocksInfo
:= TIdSocksInfo.Create;
      
IdSSLIOHandlerSocketOpenSSL:= TIdSSLIOHandlerSocketOpenSSL.Create;
      try
        
IdSocksInfo.Host:= Copy(ProxyAdress_CB.Text0Pos(':'ProxyAdress_CB.Text) - 1);
        
IdSocksInfo.Port:= StrToInt(Copy(ProxyAdress_CB.TextPos(':'ProxyAdress_CB.Text) + 1Length(ProxyAdress_CB.Text)));
        if (
Pos(ProxyType_CB.Text'4') <> 0then
          IdSocksInfo
.Version:= svSocks4;
        if (
Pos(ProxyType_CB.Text'5') <> 0then
          IdSocksInfo
.Version:= svSocks5;
        
IdSSLIOHandlerSocketOpenSSL.TransparentProxy:= IdSocksInfo;
        
IdHTTP.IOHandler:= IdSSLIOHandlerSocketOpenSSL;
        
IdHTTP.ProxyParams.ProxyServer:= Copy(ProxyAdress_CB.Text0Pos(':'ProxyAdress_CB.Text) - 1);
        
IdHTTP.ProxyParams.ProxyPort:= StrToInt(Copy(ProxyAdress_CB.TextPos(':'ProxyAdress_CB.Text) + 1Length(ProxyAdress_CB.Text)));
        try
          
parse:= IdHTTP.Get('http://automation.whatismyip.com/n09230945.asp');
          
Result_M.Lines.Add(IdHTTP.ProxyParams.ProxyServer);
          if (
Pos(IdHTTP.ProxyParams.ProxyServerparse) <> then
            Result_M
.Lines.Add('+OK')
        
except
          Result_M
.Lines.Add('-NO');
        
end;
      finally
        
IdSocksInfo.Free;
        
IdSSLIOHandlerSocketOpenSSL.Free;
      
end;
    
end
    
else begin
      IdHTTP
.ProxyParams.ProxyServer:= Copy(ProxyAdress_CB.Text0Pos(':'ProxyAdress_CB.Text) - 1);
      
IdHTTP.ProxyParams.ProxyPort:= StrToInt(Copy(ProxyAdress_CB.TextPos(':'ProxyAdress_CB.Text) + 1Length(ProxyAdress_CB.Text)));
      try
        
parse:= IdHTTP.Get('http://automation.whatismyip.com/n09230945.asp');
        
Result_M.Lines.Add(IdHTTP.ProxyParams.ProxyServer);
        if (
Pos(IdHTTP.ProxyParams.ProxyServerparse) <> then
          Result_M
.Lines.Add('+OK')
      
except
        Result_M
.Lines.Add('-NO');
      
end;
    
end;
  finally
    
IdHTTP.Disconnect;
    
IdHTTP.Free;
  
end;
end
Программа чекает проксю на валидность, переодически вываливается с ошибкой Socket Error 10051 - сеть не доступна, не могу понять почему, должно ведь вроде бы уходить в except.. возможно нужно таймауты расставить или что-то подобное, вобщем я зарылся.. прошу направить на путь истиный ) ещё если кто может подскажите что нужо для работы с https прокси
Once вне форума Ответить с цитированием
Старый 21.08.2011, 21:13   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а может быть потому что вы запускаете под отладчиком?(который по умолчанию всегда показывает исключения(и там кстати можно нажать продолжить))
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.08.2011, 22:19   #3
Once
Пользователь
 
Регистрация: 21.08.2011
Сообщений: 14
По умолчанию

Точно.. с исключениями разобрался )
А ещё можно вас попросить, если не трудно прокоментировать парой слов мой код, насколько он далёк от того что используют в средненьких рядовых програмках и что следовало бы добавить или убрать, не сильно ли я перестарался с траями? и ещё хотел узнать, хватит ли такого простого запроса для проверки прокси?
Сори на настойчивость, просто интересно как это всё делают уже закалённые люди

Последний раз редактировалось Once; 21.08.2011 в 22:22.
Once вне форума Ответить с цитированием
Старый 21.08.2011, 22:24   #4
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

думаю, вполне нормальный код, но смотреть вам, для каких целей его применять
bulldog5293 вне форума Ответить с цитированием
Старый 21.08.2011, 23:18   #5
Once
Пользователь
 
Регистрация: 21.08.2011
Сообщений: 14
По умолчанию

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

Последний раз редактировалось Once; 22.08.2011 в 01:23.
Once вне форума Ответить с цитированием
Старый 23.08.2011, 00:12   #6
Once
Пользователь
 
Регистрация: 21.08.2011
Сообщений: 14
По умолчанию

Ладненько, с данным куском кода всё ясно, немного доработал.
Наверное по теме больше постов не будет и тему можно прекрыть. Жаль правда, что не услышал рекомендаций по поводу стоит ли использовать инди для работы с сетью или стандартные компоненты делфи лучше, или может быть стоит самому научитсья программировать сокеты, но может я не в тот раздел написал.
Честно говоря хочется пообщаться на тему сетевых технологий с опытным программером, а я думаю здесь таких хватает Поэтому хотел попросить может аську кто даст, для переодического настукивания, если не лень помочь начинающему коллеге на тему как увязать прокси с многопоточностью ) или если кто-нибудь из таких же начинающих захочет объедениться.. пишите в лс, есть идейки для дальнейшей разработки. Вместе оно всё веселей
Once вне форума Ответить с цитированием
Старый 23.08.2011, 12:17   #7
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
По умолчанию

Судя по набору терминов, ждём очередного спамероинвайтера...
Lime вне форума Ответить с цитированием
Старый 23.08.2011, 13:03   #8
Once
Пользователь
 
Регистрация: 21.08.2011
Сообщений: 14
По умолчанию

Да нет друг, я преследую более благородные цели..
Once вне форума Ответить с цитированием
Старый 24.08.2011, 20:12   #9
Once
Пользователь
 
Регистрация: 21.08.2011
Сообщений: 14
По умолчанию

Друзья у меня ещё вопросик.. ) как мне и изменить проксю в Idhttp прям при работе допустим в цикле при определённых условиях.. нужно ли делать IdHTTP.Disconnect или нет? покачто пытаюсь только так )
Код:
IdHTTP.ProxyParams.ProxyServer:= тут новый адрес из списка;
IdHTTP.ProxyParams.ProxyPort:= тут порт к новому адресу;
MailInform_M.Lines.Add('Replacement IP: ' + IdHTTP.ProxyParams.ProxyServer);
дальше запрос и всё, программа виснет.. исключение выскакиевает Socket Error #10038 подскажите как быть
Once вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подход к решению kaar Помощь студентам 2 04.04.2010 11:56
Заказ Нужен грамотный php don131977 Фриланс 1 22.01.2010 18:40
Нужен грамотный совет! miraclecome Свободное общение 12 01.08.2009 00:04