Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Не работает функция проверки HTTP прокси серверасервера (https://forum.antichat.xyz/showthread.php?t=132925)

RumShun 04.08.2009 12:14

Не работает функция проверки HTTP прокси серверасервера
 
вобщем вот код
Код:

  TProxy = record
  adrIA:TInAddr;
  adr:string[15];
  port:integer;
  end;
function checkHttp(Serv:String;Port:integer;proxy:TProxy):boolean;
var
 sock:TSocket;
 addr:TSockAddrIn;
 Buff: array[0..255] of char;
begin
 result:=false;
 FillChar(Addr.sin_zero, SizeOf(Addr.sin_zero), 0);
 addr.sin_family:=AF_INET;
 addr.sin_port:=htons(proxy.port);
 addr.sin_addr:=proxy.adrIA;
 connect(sock, @addr, SizeOf(addr));
 str:='CONNECT '+serv+':'+inttostr(port)+' HTTP/1.0\r\nUser-Agent: Opera/9.60\r\n';
 send(Sock,str,sizeof(str),0);
 FillChar(Buff,sizeof(Buff), 0);
 recv(sock2,Buff,sizeof(Buff),0);
 if buff[10]='2' then result:=true;
  closesocket(sock2);
end;

максимальное его упростил, пробовал уже и так и эдак, нифига не получаеться подвисает на
recv(sock2,Buff,sizeof(Buff),0);
потом ничего не принимает.
Цитата:

В RFC 2616 (HTTP 1.1) описаны следующие методы: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT.
Пролистав ниже по спецификации, читаем следующее о методе CONNECT: "Спецификация резервирует имя метода CONNECT для использования с прокси, которые могут динамически переключаться на работу в качестве туннеля (например, туннелирование SSL)". Далее идет ссылка на документ (draft-luotonen-web-proxy-tunneling-XX), некоторые выдержки из которого будут приводиться ниже. Этот документ описывает расширение протокола HTTP 1.x (не только 1.1, но и 1.0) для организации туннелирования TCP-based протоколов через веб-прокси. Теперь собственно о том, как это работает.
1. Клиент соединяется с HTTP Proxy, поддерживающим метод CONNECT.
2. Клиент посылает серверу строку вида "CONNECT target_host:target_port HTTP/1.x\r\nUser-Agent: User Agent\r\n"
3. В ответ на эту строку сервер может либо потребовать авторизацию, либо вернуть состояние удачного соединения либо ошибку.
вроде все просто, где чево не понимаю не могу найти. :confused:

slesh 04.08.2009 12:45

Проверь снифером правильно запрос идет или нет.
Но главное - HTTP хидер должен заканчиваться на 2 CRLF

А теперь самое главное:
str:='CONNECT '+serv+':'+inttostr(port)+' HTTP/1.0\r\nUser-Agent: Opera/9.60\r\n';

\r\n - это сишные и в Delphi такое не прокатит. и как видиш у тебя тока 1 CRLF вконце

По этому перепиши:
str:='CONNECT '+serv+':'+inttostr(port)+' HTTP/1.0'+#13#10+'User-Agent: Opera/9.60'+#13#10#13#10;

СРазу видно что код не рабочий.
str - вообще не объявлено нигде.
если str - string
то лучше send делать так:
send(Sock,@str[1], length(str),0);

А вообще судя по коду - это вообще недолно работать потому как ты даже сокет не создаеш. Выкини код и напиши нормальный, а не передирай из Си.

RumShun 05.08.2009 05:09

Цитата:

СРазу видно что код не рабочий.
str - вообще не объявлено нигде.
рабочий, просто выдран из контекста
Цитата:

А теперь самое главное:
str:='CONNECT '+serv+':'+inttostr(port)+' HTTP/1.0\r\nUser-Agent: Opera/9.60\r\n';

\r\n - это сишные и в Delphi такое не прокатит. и как видиш у тебя тока 1 CRLF вконце

По этому перепиши:
str:='CONNECT '+serv+':'+inttostr(port)+' HTTP/1.0'+#13#10+'User-Agent: Opera/9.60'+#13#10#13#10;
спасибо большое в этом проблема и была, переделал, все работает
Цитата:

если str - string
то лучше send делать так:
send(Sock,@str[1], length(str),0);
выдает ошибку Constant object cannot be passed as var parameter при компиляции (D6)
send(Sock, str, sizeof(str), 0) работает нормально.
:)

St0nX 05.08.2009 12:54

Код:

int FindString(char *str1,char *str2)
{
int nstr1,nstr2,i,j,nstr,sstr;
nstr1=strlen(str1);
nstr2=strlen(str2);
if(nstr1>nstr2)
{
nstr=nstr1-nstr2;
for(i=0;i<nstr;i++)
{
sstr=0;
for(j=0;j<nstr2;j++)
{
if(str1[j+i]==str2[j])
{
sstr++;
}
}
if(sstr==nstr2)
{
return 1;
}
}
}
else
{
return -1;
}
return 0;
}

int CheckProxy(char *proxy, int port)
{
SOCKADDR_IN anAddr;
anAddr.sin_family = AF_INET;
anAddr.sin_addr.S_un.S_addr = inet_addr(proxy);
anAddr.sin_port = htons(port);

SOCKET  Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
int tmo = 3000;
setsockopt(Socket,SOL_SOCKET,SO_RCVTIMEO,(const char*)&tmo,sizeof(tmo));

int i;
char Answer[40];
char HTTPAnswer[] = "HTTP/1.1";
connect(Socket, (struct sockaddr *)&anAddr, sizeof(struct sockaddr));
//SOCKS
char Message2[] = {0x05,0x01,0x00};
send(Socket,Message2,3, 0);
memset(Message2,0,3);
recv(Socket, Message2, 3, 0);
if(Message2[0]==0x05)
{
return 5;
}
else
{
//http
char zSend[] = "GET / HTTP/1.1\r\nUser-Agent: Opera/9.63 (Windows NT 5.1; U; ru) Presto/2.1.1\r\nHost: www.google.com\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: ru-RU,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: deflate, gzip, x-gzip, identity, *;q=0\r\nCookie: rememberme=true;\r\nPREF=ID=cbb453ccc57c8739:TM=1228397956:LM=1228457555:GM=1:S=PD__kjM08drYVN99;\r\nNID=19=QiJDI3cjj8O4IHJ3M7LO81Clx9avdSixKEHLLgqFw1OtlYjy_Iqt-qOwO1WuTYj6_ZgNzf_eWRndnTWkAQ-N7hfii7nh7skDUtQtpMEsLFOq1MisvpHTzQn9g0FCZXwO;\r\nSID=DQAAAH0AAAAg2B1ks0PiX3lB6cSvZSSgCiGHwjea5TLv7CzWzH5q23MkMc7Ikj0h5pWoM4nrfSIVq-9upxKQd-QWc-NZkZNggOE425YOTsNEks-R3Zfae0k8tEpyLVG-aQI6zq90BlzIYB99XcDSfy\r\nb79S2_-80zTE82Q9PY-7VE5l2SrvTIw\r\nCookie2: $Version=1\r\nConnection: Keep-Alive, TE\r\nTE: deflate, gzip, chunked, identity, trailers\r\n\r\n";
send(Socket,zSend,strlen(zSend), 0);
recv(Socket, Answer, 40, 0);
if(FindString(Answer,HTTPAnswer)==1)
return 3;
}

closesocket(Socket);
return -1;
}

Когда то писал... определяет тип и живая не живая


Время: 17:21