Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Winsock и Proxy


Автор: ScoL 3.4.2008, 23:34
Ув. Форумчане кто может подсказать как приконнектиться к прокси и через него послать какие либо данные ? (поиск юзал, ничего подходящего не нашел)

Автор: Snowy 4.4.2008, 11:48
Присоедениться к прокси - так-же, как и к любому другому серверу.
А, непосредственно, отправка данных через него зависит от типа прокси и протокола.

Автор: ScoL 4.4.2008, 16:01
просто через connect ? прокси http.... если можно то примерчик как послать данные через http прокси.... smile  или ссылку на материал по данной теме )

Автор: Virtuals 7.4.2008, 07:18
работа через прокси отличается от обычного HTTP (и не только), все го лиш одной доп. коммандой.

исходная:
прокси proxy
порт 8080

если для прямого соединения вы подключаетесь к forum.vingrad.ru и порту 80
и шлете
Код

get forum.vingrad.ru


то с прокси
вы подключаетесь к proxy и порту 8080
шлете 

Код

connect http://forum.vingrad.ru:80


получаете типа

Код

HTTP/1.0 200 Connection established
Pragma: no-cach
Content-Type: text/html; charset=windows-1251


(сдесь главное HTTP/1.0 200 )
а далее как обычно

Код

get forum.vingrad.ru

Автор: ScoL 7.4.2008, 15:06
Virtuals, спс разобрался  smile 

Автор: HiVeR 1.4.2009, 14:52
собсно не получается...
постоянно летят Error'ы на recv'е непонятно почему и зачем.. очень редко было всё ок, и на выходе от прокси получал страницу с "400, Bad Request".. но это было всего пару раз..
перепроверил кучу проксей, многие из них 100% рабочие, а мой код их не хочет брать(. думаю изза неправильного запроса.. или неправильного принятия данных, хотя вроде всё верно.
вот основная часть кода, выделил самые сомнительные места, hpack - перепробовал кучу самых разных вариантов - и с #13#10#13#10 и без них, совсем по разному писал url - и с http:// и без, и ещё пару вариантов - с http:// ваще ни в какую не шло, а просто если домен - то вроде что-то отправлялось.. кароч жесть путаница), подскажите плз что тут нетак:
Код

procedure ProxyConnect(ProxyIP:string;ProxyPort:word;Url:string);
var Sock:TSocket; 
    SockAddr:TSockAddr;
    hpack, hresult:string; //hpack - отправляемый пакет, hresult - ответ
    res:integer;
    buf:array[0..1023]of char;
begin
Sock:=Socket(AF_INET, SOCK_STREAM, 0);
if Sock=INVALID_SOCKET
 then
   begin
   MessageBox(0,'Invalid Socket','Error',0);
   exit;
   end;

SockAddr.sin_family:=AF_INET;
SockAddr.sin_port:=htons(ProxyPort);
SockAddr.sin_addr.S_addr:=Inet_Addr(ProxyIP);

if Connect(Sock, SockAddr, sizeof(SockAddr))=Socket_Error
 then
   begin
   MessageBox(0,'Timeout proxy','Error',0);
   CloseSocket(Sock);
   exit;
   end;

hpack:='connect '+URL+':80'+' HTTP/1.1'+#13#10#13#10;

if send(Sock, hpack[1], Length(hpack), 0)=Socket_error //отправляем пакет
 then
   begin
   MessageBox(0,'Send Error','Error',0);
   CloseSocket(Sock);
   exit;
   end;

Repeat //принимаем
  Res := recv(Sock, Buf, SizeOf(Buf), 0);
  if Res = SOCKET_ERROR
   then
     begin
     MessageBox(0,'Recv Error','Error',0);
     CloseSocket(Sock);
     exit;
     end
   else
     if Res > 0
      then
        begin
        hresult := hresult + Copy(Buf,0, Res);
        end;
until Res<=0;

if (pos('HTTP/1.0 200', hresult)<>0)
 or (pos('HTTP/1.1 200', hresult)<>0)
  then MessageBox(0,'OK','!',0) // OK
  else MessageBox(0,'Ne ok...','!',0); // Proxy Error
MessageBox(0, pchar(hresult),'Result',0);
CloseSocket(Sock);
end;

в основном пробовал коннектиться к yoip.ru - через проксю в браузере норм коннектилось, а тут Recv Error или пустой результат после долгого ожидания, или просто невозвратное зависание.

Автор: Matematik 1.4.2009, 16:17
Возьми сниффер, забей в браузер проксю и посмотри что и как посылает.
Потом попробуй своей программой и сравни.

Автор: HiVeR 1.4.2009, 17:17
Matematik, спс за совет, так очевидно - а попробовать ранее чёто в голову не пришло).
впринципе обошлось и без этого), просто всё проще:
Код

hpack:=
  'GET http://yoip.ru:80/ HTTP/1.1'+#13#10+
  'Host:yoip.ru'+#13#10+
  'User-Agent:Mozilla/3.0 (compatible; Indy Library)'+#13#10#13#10;

вот такого вида запрос у индейцев,  работает smile . Только не очень хорошо, что сразу читается вся страница, лучше бы просто коннект. браузер у меня проснифать не получилось - хттп сниф не ловит самый первый запрос(если он есть), а через сниффер, который всё ловит (IP Sniffer 1.98) - наловил кучу запросов между проксей и моим компом - и в основном там каракули.. мож неправильно проснифал... 
способ, описанный Virtuals в 4ом посте, тоже вроде работает, но наверно чего-то не хватает..

Автор: KeeRush 7.4.2009, 21:04
Доброго времени суток.
А как быть в том случае если протокол отличен от HTTP?
Ситуация: сервер получает данные с приборов по TCP. Для этого создаю слушающий сокет и когда приходит пакет от прибора то уже устанавливаю соединение с ним по новому сокету. А что делать если нужно работать через прокси?

Автор: Virtuals 8.4.2009, 05:41
KeeRush слушать через прокси никак, а вот устанавливать соединение влегкую.
Код

connect ипприбора:портприбора

главное чтоб твой прокси несопротивлялся. smile
ЗЫ я так с почтой работаю по POP3 $)

Автор: KeeRush 8.4.2009, 05:49
Virtuals, В том то и проблема что соединение инициируют приборы. Сервер лишь создает слушающий сокет и ждет.

Автор: Virtuals 8.4.2009, 12:34
KeeRushтогда увы...
слушающий сокет должен быть в одное сети с прибором, без никаких проксей.
озвуч задачу подробней... 
приложение сам пишеш?
где приборы и где нужно инфу получать?

Автор: KeeRush 8.4.2009, 12:50
Да приложение пишу сам. Сервер оформлен в виде сервиса WinNT. Приборы выходят в инет по GPRS и стучат на определенный ИП по определенному порту. Сервер соответственно обменивается с приборами информацией по внутреннему протоколу и обрабатывает ее. Заказчик выдвигает требование чтобы система работала за прокси. FreeCap и иже с ними не приветствуются. Как то так smile 

Автор: Virtuals 8.4.2009, 13:22
KeeRush, в любом соединении сетевом. ХОТЯБЫ 1 из двоих обязан иметь белый IP. или если за NATом то проброс портов. 
другого не дано!!!
так что может не прокси а всетаки нат или фаер перед сервером.?

Автор: KeeRush 8.4.2009, 15:16
Virtuals, Немного не понимаю при чем тут фаер. Думаю возникло некоторое непонимание smile
На данный момент система работает. Сервер имеет "белый" ИП. Приборы при выходе на связь получают свои динамические "белые" ипы (насколко я знаю ни один из GSM операторов не предоставляет статические ИПы). Но другой заказчик находится на территории режимного объекта и выход в инет имеет только через прокси сервер доступа к администрированию которого нет никакого. Таким образом НАТ не проходит. Я так понял что задача классическими методами не решаема.
Но все равно спасибо за помощь! smile

Автор: Virtuals 8.4.2009, 16:12
KeeRush, ну во первых гсм операторы чаще дают не белый ип а за NATом. smile
...
вот теперь ситуация проясняется.
заказчику нужно обязательно реал-тайм управление? или достаточно просто инфу мониторить?

Автор: KeeRush 11.4.2009, 16:12
Не понял вопроса smile
может быть еще прояснить ситуацию? smile
Приборы - GPS треккеры которые по GPRS передают информацию на сервер. Для передачи информации они устанавливают коннект с сервером. Соединение с сервером живет до тех пор пока прибору есть что передавать или пока не оборвется GSM сигнал. С нашими настройками прибору всегда есть что передавать таким образом соединение живет достаточно долго. Одновременно на связи может находится несколько десятков приборов.  Прибору указывается на какой ИП стучать и по какому порту. Ну а что добавить про сервер я уже не знаю smile нужно сделать так чтобы сервер работал если доступ в инет идет через прокси.

Автор: Virtuals 13.4.2009, 05:32
KeeRush
дык вот теперь понятно. smile 

так зачем изобретать велосипед?

сервер обязан иметь белый (или НАТ но с проброшеными портами) инет.
отсюда, самое простое, и кстати самое надежное!

внешний хостинг, с потдержкой пхп и мускула.
//все а далее дело техники
.трекеры стучатся на вэб сервер, передают свой ид и другую инфу...
.пхп скрипт все пишет в мускульную базу данных.
. все кому нужно забирают данные черех вэб морду (вот тут есть где фантазии развернутся  smile ).

несомненные плюсы. данной схемы.
.вам пофиг какой у клиента инет, хоть через мобилу пусть выходят, проект универсален для всех.
.внешний хостинг, /в большинстве случаев/ реально имеет более "толстые" и самое главное более надежные каналы в инет. (что повысит надежность системы в целом)

ЗЫ извиняюсь за офтоп. smile 
. и если вам так захочется "подоить заказчика на бабки" (а так кстати большинство и поступают, в данном напр. услуг) то хостинг открываете вы на себя, а клиенту даете только реквизиты входа для трекеров и клиентов мониторинга. (и доите, доите клиента (точнее не клиента, а много, очень много клиентов, т.к. на одном хостинге можете иметь кучу баз данных) ежемесячно, за т.н. техническую потдержку системы) //способ некрасивый, но бизнес есть бизнес, а заказчику просто неоткрывается вся поднаготная сервиса. (деньги заплатил, получил список ид для треккеров, и реквизиты входа для сьема данных)

Автор: KeeRush 13.4.2009, 05:47
И вправду ушли от темы smile
К сожалению по ряду причин предложенная схема не подходит :(

Автор: Virtuals 14.4.2009, 04:55
KeeRush, увы другого недано, так что решай свой ряд причин.

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