Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.06.01;
Скачать: [xml.tar.bz2];

Вниз

после recv виснет   Найти похожие ветки 

 
Res   (2008-05-05 14:33) [0]

Здравствуйте. У меня проблема в том, что после recv, функция зависает и перестает работать, но данная проблема только с yandex.ru(ya.ru), подскажите пожалуйста, как ограничить время выполнения recv или этого участка кода.


function getpage(url:string):string;
var
 D:WSAData;
 S:TSocket;
 A:TSockAddr;
 name,path:string;
 buff:array[0..1023] of char;
 httpsend,httpresponse:string;
 recived,n:integer;
begin
httpresponse:="";
{Ñíà÷àëà ïðîâåðÿåì ïðàâèëüíîñòü...}
if(copy(url,1,7)<>"http://") then
begin
exit;
end;
url:=copy(url,8,length(url));
n:=Pos("/",url);
if(n=0) then
begin
 name:=copy(url,1,length(url));
 path:="/";
end
else
begin
 name:=copy(url,1,n-1);
 path:=copy(url,n,length(url));
end;
{&#209;&#242;&#224;&#240;&#242;&#243;&#229;&#236;}
 if WSAStartup($101,D)<>0 then
 begin
   result:="";
   WSACleanup;
   exit;
 end;
{ &#206;&#239;&#240;&#229;&#228;&#229;&#235;&#255;&#229;&#236; &#242;&#232;&#239; &#241;&#229;&#236;&#229;&#233;&#241;&#242;&#226;&#224; &#241;&#238;&#234;&#229;&#242;&#238;&#226;, &#232; IP &#224;&#228;&#240;&#229;&#241; &#228;&#235;&#255; &#241;&#234;&#224;&#237;&#232;&#240;&#238;&#226;&#224;&#237;&#232;&#255; }
A.sin_family:=AF_INET;
A.sin_addr.S_addr:=inet_addr(pChar(NameToIP(name)));
A.sin_port:=htons(80);
S:=socket(AF_INET,SOCK_STREAM,0);
if S=INVALID_SOCKET then
begin
   result:="";
   WSACleanup;
   exit;
end;
if connect(S,A,sizeof(A))<>0 then
begin
   result:="";
   WSACleanup;
   exit;
end;
{&#207;&#238;&#241;&#242;&#240;&#238;&#229;&#237;&#232;&#229; &#231;&#224;&#239;&#240;&#238;&#241;&#224;}
httpsend:="GET "+path+" HTTP/1.1"+#13#10+
          "Host: "+name+#13#10+
         "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; ru; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9"+#13#10+
          "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"+#13#10+
          "Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3"+#13#10+
          "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7"+#13#10+
          "Keep-Alive: 300"+#13#10+
          "Connection: keep-alive"+#13#10#13#10;
try
  send(s, HTTPSend[1], 1024,0);
except
   result:="";
   WSACleanup;
   exit;
end;
recived:=1;
while(recived>0) do
begin
   try
     Recived:=Recv(s,buff,1024,0);
   except
     result:=httpresponse;
     WSACleanup();
     exit;
   end;
   messagebox(0,PAnsiChar("asdasd"),"11",0);
   HttpResponse:=httpresponse+Copy (Buff,1,Recived);
 end;
result:=httpresponse;
WSACleanUp;
end;


 
DVM ©   (2008-05-05 14:39) [1]


> как ограничить время выполнения recv или этого участка кода.

Select() последний параметр.  Или неблокирующие сокеты и собственный отсчет времени.


 
Res   (2008-05-05 14:49) [2]


> Select() последний параметр

А есть какой - нибудь примерчик?
не дружу я с с++ :( Первые 4 параметра, мне не понятны
int select (

   int nfds,
   fd_set FAR * readfds,
   fd_set FAR * writefds,
   fd_set FAR * exceptfds,
   const struct timeval FAR * timeout
  );


 
Res   (2008-05-05 16:03) [3]

Сделал с помошью select. Или я неправильно сделал или это непашет :(
Подскажите пожалуйста, где я ошибся
function getpage(url:string):string;
var
 D:WSAData;
 S:TSocket;
 A:TSockAddr;
 name,path:string;
 buff:array[0..1023] of char;
 httpsend,httpresponse:string;
 recived,n:integer;
 FDSet:TFDSet;
 tv: timeval;
begin
tv.tv_sec:= 20; //timeout 20 seconds
tv.tv_usec:= 0;
httpresponse:="";
{Сначала проверяем правильность...}
if(copy(url,1,7)<>"http://") then
begin
exit;
end;
url:=copy(url,8,length(url));
n:=Pos("/",url);
if(n=0) then
begin
 name:=copy(url,1,length(url));
 path:="/";
end
else
begin
 name:=copy(url,1,n-1);
 path:=copy(url,n,length(url));
end;
{Стартуем}
 if WSAStartup($101,D)<>0 then
 begin
   result:="";
   WSACleanup;
   exit;
 end;
{ Определяем тип семейства сокетов, и IP адрес для сканирования }
A.sin_family:=AF_INET;
A.sin_addr.S_addr:=inet_addr(pChar(NameToIP(name)));
A.sin_port:=htons(80);
S:=socket(AF_INET,SOCK_STREAM,0);
if S=INVALID_SOCKET then
begin
   result:="";
   WSACleanup;
   exit;
end;
if connect(S,A,sizeof(A))<>0 then
begin
   result:="";
   closesocket(s);
   WSACleanup;
   exit;
end;
{Подготавливаем сокет}
FD_Zero(FDSet);
Select(0,@FDSet,nil,nil,@tv);
if FD_IsSet(S,FDSet) then
begin
   messagebox(0,PAnsiChar("Урааа"),"11",0);
end;
{Построение запроса}
httpsend:="GET "+path+" HTTP/1.1"+#13#10+
          "Host: "+name+#13#10+
         "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; ru; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9"+#13#10+
          "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"+#13#10+
          "Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3"+#13#10+
          "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7"+#13#10+
          "Keep-Alive: 300"+#13#10+
          "Connection: keep-alive"+#13#10#13#10;
try
  send(s, HTTPSend[1], 1024,0);
except
   result:="";
   closesocket(s);
   WSACleanup;
   exit;
end;
recived:=1;
while(recived>0) do
begin
   messagebox(0,PAnsiChar("asdasd"),"11",0);
   try
   Recived:=Recv(s,buff,1024,0);
   messagebox(0,PAnsiChar("asdasd"),"11",0);
   except
     result:=httpresponse;
     closesocket(s);
     WSACleanup();
     exit;
   end;
   messagebox(0,PAnsiChar("asdasd"),"11",0);
   HttpResponse:=httpresponse+Copy (Buff,1,Recived);
 end;
result:=httpresponse;
closesocket(s);
WSACleanUp;
end;

end.


 
DVM ©   (2008-05-05 22:56) [4]


> Или я неправильно сделал или это непашет :(

Ты неправильно сделал, разумеется.

 FD_ZERO(Rfds);
 FD_SET(Sock, Rfds);
 Found := select(Sock, @Rfds, nil, nil, @FTimeout);
 if Found = 0 then
   begin
     // Select timed out
     Result := -1;
     exit;
   end
 else
   if Found = SOCKET_ERROR then
     begin
       // Select error
       Result := -1;
       exit;
     end;
 // Если добрались сюда, то можно начинать читать

Правда, перед чтением хорошо бы еще проверить, что есть вообще что читать:

ioctlsocket(Sock, FIONREAD, TotalBytesToRead)


 
Сергей М. ©   (2008-05-06 09:17) [5]


> Res


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



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.06.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.042 c
15-1208451382
Поп Гапон
2008-04-17 20:56
2008.06.01
Хрущёвские реформы


15-1207998351
Anatoly Podgoretsky
2008-04-12 15:05
2008.06.01
www.podgoretsky.com


15-1208171268
Kolan
2008-04-14 15:07
2008.06.01
Выложил программку для генерации скриптов MS SQL


15-1208581344
Armond
2008-04-19 09:02
2008.06.01
Кто подскажет, хде мона взять стандартные компоненты вкладки ADO


15-1208062484
anton773
2008-04-13 08:54
2008.06.01
борьба с пиратством





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский