Конференция "WinAPI" » winsock http несколько запросов за одно соединение [D7, WinXP]
 
  • Reqyz (07.10.14 16:28) [0]
    Есть некий сайт, есть несколько страниц на нем, например:
    Некий сайт\страница1
    Некий сайт\страница2
    Некий сайт\страница3
    ....
    Некий сайт\страницаN

    Вопрос, как за одно соединение отправить несколько запросов, получения текста этих страниц.

    у меня пока получается только одну страницу проверить за одно соединение, при последующих запросах, ответа нет(..

    вот мой пример:

    function gotolink(s:array of string):boolean;
    var
     ASocket:TSocket;
     LAddr: TSockAddrIn;
     i:integer;
     VPort:word;
     VIP:word;
     LHost:THostEnt;
     FDSet:TFDSet;
     Buffer:array[0..4999]of char;
     Count:integer;
     i2:integer;
    begin
     ASocket:=Socket(AF_INET, SOCK_STREAM, 0);//V
     if(ASocket>0)then
     begin
       LAddr.sin_family := af_inet;
       LAddr.sin_addr.s_addr := INADDR_ANY;
       LAddr.sin_port:=htons(0);//V
       if(Bind(ASocket, @LAddr, SizeOf(LAddr))=0)then//V
       begin
         i:=SizeOf(LAddr);
         if(GetSockName(ASocket,PSockAddr(@LAddr),i)=0)then
         begin
           VPort:=Ntohs(TSockAddr(LAddr).sin_port);
           if(VPort>0)then
           begin
             if(setsockopt(ASocket,IPPROTO_TCP, TCP_NODELAY, '', 4)=0)then
             begin
               LHost := GetHostByName('Сайт')^;
               if(@LHost<>nil)then
               begin
                 LAddr.sin_addr.S_un_b.s_b1 := Ord(Lhost.h_address_list^[0]);
                 LAddr.sin_addr.S_un_b.s_b2 := Ord(Lhost.h_address_list^[1]);
                 LAddr.sin_addr.S_un_b.s_b3 := Ord(Lhost.h_address_list^[2]);
                 LAddr.sin_addr.S_un_b.s_b4 := Ord(Lhost.h_address_list^[3]);
                 LAddr.sin_port := HToNS(80);
                 if(connect(ASocket,@LAddr, SizeOf(LAddr))=0)then
                 begin
                   i:=SizeOf(LAddr);
                   if(GetSockName(ASocket,PSockAddr(@LAddr),i)=0)then
                   begin
                     VPort:=Ntohs(TSockAddr(LAddr).sin_port);
                     if(Vport>0)then
                     begin
                       i:=SizeOf(LAddr);
                       if(getpeername(ASocket,@LAddr, i)=0)then
                       begin
                         VPort:=Ntohs(TSockAddr(LAddr).sin_port);
                         if(VPort>0)then
                         begin
                           for i:=1 to 8 do
                             sendbuff[i+5]:=s[0][i];

                           send(ASocket,sendbuff[1],118,0);

                           fillchar(FDSet,sizeof(FDSet),0);
                           FDSet.fd_array[0]:=ASocket;
                           FDSet.fd_count:=1;
                           select(0,@FDSet,nil,nil,nil);
                           FillChar(Buffer,5000,0);
                           Count:=recv(ASocket,Buffer[0],5000,0);

                           for i:=1 to 8 do
                             sendbuff[i+5]:=s[1][i];

                           send(ASocket,sendbuff[1],118,0);

                           fillchar(FDSet,sizeof(FDSet),0);
                           FDSet.fd_array[0]:=ASocket;
                           FDSet.fd_count:=1;
                           select(0,@FDSet,nil,nil,nil);
                           FillChar(Buffer,5000,0);
                           Count:=recv(ASocket,Buffer[0],5000,0);//в этот раз придет пустота(

    .........................................

    sendbuff:string='GET /******** HTTP/1.1'#13#10+
                     'Host: сайт'#13#10+
                     'Accept: text/html, */*'#13#10+
                     'Accept-Encoding: identity'#13#10+
                     'User-Agent: Mozilla/3.0'#13#10+
                     #13#10;

    где символы в звездочках заменяются на ссылку.




    помогите) подскажите где я не прав и как будет правильно?)
    заранее благодарен
  • brother © (07.10.14 16:50) [1]
    эээ, один гет - один запрос...
  • Reqyz (07.10.14 17:08) [2]
    возможно вы не поняли вопроса? один гет - один запрос, это понятно.
    один коннект - несколько гетов, это не работает, у меня по крайней мере, код выше пост тоже пробовал, может запрос как то по другому должен выглядеть, чтобы ответ пришел не пустым?
  • invis © (07.10.14 19:03) [3]
    Посмотри библиотеку Synapse, класс THTTPSend, св-во KeepAlive.
    (в плане скорости скачивания множества страниц этот KeepAlive не очень помогает, лучше многопоточность)
 
Конференция "WinAPI" » winsock http несколько запросов за одно соединение [D7, WinXP]
Есть новые Нет новых   [118656   +18][b:0][p:0.004]