Delphi скачка файлов winSock

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by realcoder, 29 Mar 2011.

  1. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    в общем потребовалось написать код скачки файлов с помощью winsock. посмотрел httpanalyzer-ом за браузером и отправил такой же запрос из программы, а потом парсил ответ от сервера и писал его в файл. вот что получилось:
    Code:
    var f:textfile;
    
    function GetIP(host:pchar): String;
    const WSVer = $101;
    var
    wsaData: TWSAData;
    P: PHostEnt;
    
    begin
    Result := '';
    WSAStartup(WSVer, wsaData);
    
    P:=GetHostByName(host);
    if P <> nil then Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
    WSACleanup;
    
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
    ws:wsadata;
    sa:sockaddr_in;
    s:integer;
    q:string;
    i:integer;
    buf:array[1..128] of char;
    
    begin
    WSAStartup(makeword(2,2),ws);
    s:=socket(af_inet,sock_stream,0);
    sa.sin_addr.S_addr:=inet_addr(pchar(getip('zalil.ru')));
    sa.sin_port:=htons(80);
    sa.sa_family:=af_inet;
    connect(s,sa,sizeof(sa));
    q:='GET /30742288/465736c7.4d90c4d0/locker.exe HTTP/1.1'#13#10+
    'Host: zalil.ru'#13#10+
    'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ru-RU) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27'#13#10+
    'Accept: 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'#13#10+
    'Accept-Encoding: gzip, deflate'#13#10+
    'Cookie: __utma=23564465.1632283247.1300560178.1301242129.1301247479.13; __utmz=23564465.1300560178.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)'#13#10+
    'Connection: keep-alive'#13#10#13#10;
    showmessage(q);
    Send(s,q[1],length(q),0);
    AssignFile(f,'temp.tmp');
    if fileexists('temp.tmp') then
    Reset(f) else rewrite(f);
    while recv(s,buf[1],128,0)>0 do
    begin
    write(f,buf);
    end;
    CloseFile(f);
    
    end;
    
    ответ приходит примерно такой:
    Code:
    HTTP/1.1 200 OK
    Server: nginx/0.3.17
    Date: Mon, 28 Mar 2011 09:49:14 GMT
    Content-Type: application/octet-stream
    Content-Length: 30720
    Last-Modified: Sat, 26 Mar 2011 13:02:52 GMT
    Connection: keep-alive
    Content-Disposition: attachment; filename=locker.exe
    Accept-Ranges: bytes
    
    { всякие кракозябры, а именно содержимое файла}
    
    потом вручную отделил http-заголовок от контента. и сравнил его с самим файлом(который надо скачать) в winhex-е:
    контент длиннее файла. теперь вопрос:
    как из ответа от сервера выделить контент (он после #13#10#13#10($0d $0a $0d $0a) идет, но я не знаю как программно найти в файле четыре последовательных байта(можно конечно читать по чертыре байта и сравнивать, но а если число байт до этой последовательности нечетное?) ) и из него считать количество байт указанное в content-length http-заголовка?
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    не ну это пздц. Ха такие вопросы надо лишать таких ников!

    Самый простой быдлокодовский метод - искать байт #13
    и если находишь его то проверяешь следующие на #10#13#10
    Если оно значит нашел, если не оно, значит ищи дальше.
    Или тупо заюзай обычный поиск через pos причем на стадии получения данных.

    Размер файла выдирай из строки Content-Length: