Главная страница
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.49 MB
Время: 0.016 c
2-1210214413
Steve
2008-05-08 06:40
2008.06.01
Рдактирование диаграмм в MSExcel


2-1210510760
Системная служба
2008-05-11 16:59
2008.06.01
Запуск как системная служба


6-1187941092
DragonLand
2007-08-24 11:38
2008.06.01
Клиент для браузерной игры


8-1180687613
HuKoH
2007-06-01 12:46
2008.06.01
Как нарисовать в делфи круг в форме2 чтоб его радиус брался уже


2-1210235520
Андрей Пл
2008-05-08 12:32
2008.06.01
Размер в байтах!!!