Скачивание больших файлов через HTTP

Тема в разделе "WASM.BEGINNERS", создана пользователем lust, 23 сен 2008.

  1. lust

    lust New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2007
    Сообщения:
    72
    Добрый день.
    У меня есть код ,который посылает запрос сервера на скачку файла. Фрагмент кода, который принимает данные выглядит так:
    Код (Text):
    1. invoke ioctlsocket,hSocket1,FIONREAD,addr sizetoread
    2.  
    3. .IF eax==NULL
    4.    
    5.     invoke GlobalAlloc,GHND,sizetoread      ; Выделяем память для буфера  считываемых данных
    6.         mov mHandle,eax
    7.         invoke GlobalLock,eax
    8.         mov buffer,eax
    9.     invoke recv,hSocket1,buffer,sizetoread,0    ; считываем данные с сокета
    10.     mov actual_data_read, eax
    11.  
    12.     .IF actual_data_read == 0  ;если нихуя не прочиталось
    13.         invoke MessageBox, NULL, addr wsaError, addr Hello, MB_OK + MB_ICONSTOP
    14.         invoke closesocket, hSocket1
    15.         invoke WSACleanup
    16.         mov WithoutHeaderSize,0
    17.         ;invoke TerminateThread,hThread,0
    18.     .ENDIF
    19.    
    20.     invoke CreateFile,addr TESTfile,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,NULL
    21.     mov     hFile, eax
    22.     invoke WriteFile,hFile,buffer,actual_data_read,addr bWritten,NULL
    23.     invoke  CloseHandle, hFile
    Суть проблемы в том, что из сокета считывается (включая HTTP заголовок) 8 192 байта. И, соответственно, пишется в файл. Как скачать файл полностью? Я что-то слышал про пофрагментное скачивание , но по сути ничего не знаю. Есть какие-нить идеи или статьи на эту тему?

    Спасибо!
     
  2. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Читать в цикле.
     
  3. mikityak

    mikityak Забанен

    Публикаций:
    0
    Регистрация:
    5 авг 2007
    Сообщения:
    160
    Код (Text):
    1. GetInetFile proc
    2. LOCAL hSession          :DWORD
    3. LOCAL hUrl              :DWORD
    4. LOCAL hSave             :HANDLE
    5. LOCAL lpBuffer [BUFSIZ] :BYTE
    6. LOCAL dwBytesRead       :DWORD
    7. LOCAL dwPos             :DWORD
    8. LOCAL dwBytesWritten    :DWORD
    9.  
    10.     invoke GetModuleFileName, hInstance, addr AppName, sizeof AppName
    11.    
    12.     mov hSession, FUNC(InternetOpen, addr AppName, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, NULL)
    13.  
    14.     .if hSession == INVALID_HANDLE_VALUE
    15.         mov eax, INVALID_HANDLE_VALUE
    16.         ret
    17.     .endif
    18.    
    19.     mov hUrl, FUNC(InternetOpenUrl, hSession, addr szUrl, NULL, NULL, NULL, NULL)
    20.  
    21.     .if (hUrl == INVALID_HANDLE_VALUE || hUrl == 0)
    22.         mov eax, INVALID_HANDLE_VALUE
    23.         ret
    24.     .endif
    25.    
    26.     invoke DeleteFile, addr szSave ;удаляем файл ибо без етово файл постояно нарастает
    27.    
    28.     mov hSave, FUNC(CreateFile, addr szSave, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)
    29.  
    30.     .if hSave == INVALID_HANDLE_VALUE
    31.         mov eax, INVALID_HANDLE_VALUE
    32.         ret
    33.     .endif
    34.    
    35.     elsecopy:
    36.     invoke InternetReadFile, hUrl, addr lpBuffer, BUFSIZ, addr dwBytesRead
    37.    
    38.     .if eax == TRUE
    39.         mov dwPos, FUNC(SetFilePointer, hSave, NULL, NULL, FILE_END)       
    40.         mov eax, dwPos
    41.         add eax, dwBytesRead
    42.                
    43.         invoke LockFile, hSave, dwPos, NULL, eax, NULL
    44.         invoke WriteFile, hSave, addr lpBuffer, dwBytesRead, addr dwBytesWritten, NULL
    45.        
    46.         mov eax, dwPos
    47.         add eax, dwBytesRead
    48.         invoke UnlockFile, hSave, dwPos, NULL, eax, NULL
    49.     .endif  
    50.    
    51.     .if dwBytesRead == BUFSIZ
    52.         jmp elsecopy
    53.     .endif
    54.    
    55.     invoke InternetCloseHandle, hSession
    56.     invoke InternetCloseHandle, hUrl
    57.     invoke CloseHandle, hSave
    58.  
    59.     mov eax, ERROR_SUCCESS
    60.     ret
    61.    
    62. GetInetFile endp
     
  4. lust

    lust New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2007
    Сообщения:
    72
    _mikityak_, спасибо большое!
    Сегодня обязательно это попробую, но один вопрос остаётся открытым. Как это всётаки делается с помощью функций прямой работы с сокетом типа recv? И где можно глянуть исходник функции InternetReadFile ?

    Спасибо!
     
  5. mikityak

    mikityak Забанен

    Публикаций:
    0
    Регистрация:
    5 авг 2007
    Сообщения:
    160
    >>>Перед тобой [​IMG] DownLoad
    >>>[​IMG] ???
     
  6. lust

    lust New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2007
    Сообщения:
    72
    Спасибо! Камментрии такого уровня мне по нраву ;)
    Код (Text):
    1. start: ;с этого слова начинается код программы
    Суть моего вопроса в том была, что при одном заходе с recv, ты скачать не можешь полностью файл, и по этому с этой функцией нужно делать цикл. И тут нюанс в том, как считывать из сокета данные не сначала каждый раз, а со смещением равным сумме данных считанных в предыдущих контурах цикла. Сказал как мог =)\
    вот и всё в принципе)

    ЗЫ
    Ещё то что некоторые антивирусы неадекватно реагируют на этот код - не есть гуд =(