Главная страница
    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.054 c
2-1210445090
Alexey
2008-05-10 22:44
2008.06.01
Как поменять местами появление форм


3-1198486495
Виталий Панасенко
2007-12-24 11:54
2008.06.01
Ошибка выполнения запроса


2-1210427273
Werewolf-Prankster
2008-05-10 17:47
2008.06.01
Создание Label-ов с помощью TLabel.create


15-1208289360
TIF
2008-04-15 23:56
2008.06.01
Быстрый поиск в ComboBox


15-1208853107
Студент
2008-04-22 12:31
2008.06.01
SQL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский