Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.01;
Скачать: CL | DM;

Вниз

после 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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.036 c
2-1210440929
Прогмэн
2008-05-10 21:35
2008.06.01
Как узнать средствами Дельфи об антивирусах


2-1210158395
Stiff
2008-05-07 15:06
2008.06.01
получить название программы


2-1208877972
Андрей
2008-04-22 19:26
2008.06.01
Как вывести данные из нескольких таблиц в DBGrid?


2-1210585970
smartleds
2008-05-12 13:52
2008.06.01
Подскажите плз в чем может быть причина


15-1208514276
Вопрос
2008-04-18 14:24
2008.06.01
Как вам картинка ? 3dsmax.





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