Сейчас на форуме: rmn, Magister Yoda, vasilevradislav, tyns777 (+6 невидимых)

 eXeL@B —› Программирование —› Как сделать скачивалку файлов на ассемблер по http c возможностью докачки
Посл.ответ Сообщение

Ранг: 10.6 (новичок)
Активность: 0=0
Статус: Участник

Создано: 30 июля 2008 07:48
· Личное сообщение · #1

Вот код, но я не пойму как сделать так чтобы можно было возобновить докачку файла, а не скачить его загого.
;EasyCodeName=Download,1
.386
.model flat,stdcall
option casemap:none

include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib
include wininet.inc
includelib wininet.lib
;GetFileName PROTO :DWORD
.data
; "http://www.robotask.com/downloads/RoboTaskSetup.exe",0
ifmt BYTE "%ib",0
crlf BYTE 13,10
msgOk DB "Connection error!",0
success DB "Download is end",0
noname DB "Wrong data in clipboard...i'll be terminate",13,10

FileName DB " ",0
;try_get_name db "I'll try to get url ",13,10
filez dword ?
sizef DD ?
Bufferlen dword ?

.data?
buf DB 51 dup(?)
AppName DB 127 dup(?)
fHand DD ?
bwrite DD ?
hInstance HINSTANCE ?
;fHand2 dd ?
displayh DD ?
Buffer DB 15500 Dup(?) ;buffer for download data

ThreadID DWORD ?
;hTarget DWORD ?

getstd macro
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov displayh,eax
EndM
.code
start:
GetInetFile proc

LOCAL hSession: DWORD
LOCAL hUrl: DWORD
;LOCAL Bufferlen: DWORD
LOCAL nSize: DWORD
LOCAL fileUrl: DWORD
local filedata: DWORD

getstd
;invoke MessageBox, 0, addr msgErr, addr mcap, MB_OK
;invoke wsprintf,addr buf,addr try_get_name,0
;invoke WriteConsole,displayh,addr buf,sizeof buf,0,0
call GetFileName
;call Startdownload
; invoke WriteConsole,displayh,addr startd,sizeof startd,0,0
invoke GetModuleFileName, hInstance, addr AppName, sizeof AppName
invoke InternetOpen, addr AppName, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, NULL
mov hSession, eax
.if hSession == INVALID_HANDLE_VALUE
ret
.endif

invoke GetClipboardData,CF_TEXT
mov fileUrl,eax
invoke InternetOpenUrl, hSession, fileUrl, NULL, NULL, NULL, NULL
mov hUrl, eax
.if hUrl == 0
;invoke MessageBox, 0, addr msgOk, addr FileName, MB_OK


invoke Sleep,3000
ret
.endif
mov fileUrl,0
invoke CreateFile, addr FileName, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ,
NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL
mov fHand, eax
.if fHand == 0
ret
.endif
invoke SetFilePointer, fHand, NULL, NULL, FILE_BEGIN
;HANDLE CreateThread(

;LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes
;DWORD dwStackSize, // initial thread stack size, in bytes
;LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function
;LPVOID lpParameter, // argument for new thread
;DWORD dwCreationFlags, // creation flags
;LPDWORD lpThreadId // pointer to returned thread identifier
;);

mov eax,OFFSET getsize

invoke CreateThread,NULL,NULL,eax,NULL,NULL,ADDR ThreadID
download:
;call getsize
invoke InternetReadFile, hUrl, addr Buffer, sizeof Buffer, addr Bufferlen
.if Bufferlen != 0

invoke WriteFile, fHand, addr Buffer, Bufferlen, ADDR bwrite, NULL
jmp download
.endif
invoke CloseHandle, fHand
invoke InternetCloseHandle, hUrl
invoke InternetCloseHandle, hSession
invoke CloseClipboard
;terminating thread

invoke MessageBox, 0, addr success, addr FileName, MB_OK
invoke ExitProcess,0
ret
GetInetFile endp



GetFileName proc URL:DWORD

invoke OpenClipboard,NULL
invoke GetClipboardData,CF_TEXT
cmp word ptr ds:[eax],"th"; must be reversed!
jnz second_check; first check
go:
invoke lstrcpy,addr URL, eax
invoke RtlFillMemory,addr FileName,256,0
invoke lstrlen,addr URL
std
mov edi, edx
add edi,eax
dec edi
mov ecx,eax
mov al,"/"
repne scasb
cld
cmp byte ptr [URL],"/"
je No_name
inc edi
inc edi
invoke lstrcpy,addr FileName,edi
ret
No_name:
getstd
;invoke MessageBox, 0, addr msgErr, addr mcap, MB_OK
;invoke wsprintf,addr buf,addr noname,0
;invoke WriteConsole,displayh,addr noname,sizeof noname,0,0


invoke MessageBox, 0, addr noname, addr FileName, MB_OK
invoke ExitProcess,0
second_check:
cmp word ptr ds:[eax],"TH"
jnz No_name; not equal? Exit!
je go ; equal, then try to download
ret
GetFileName endp
Startdownload proc
getstd
;invoke wsprintf,addr buf,addr startd,0
;invoke WriteConsole,displayh,addr buf,sizeof buf,0,0
Ret
Startdownload EndP
getsize proc


;local hTarget:DWORD
;local filez:DWORD

;invoke CreateFile,addr FileName,FILE_SHARE_READ+FILE_SHARE_WRITE,NULL,
;OPEN_EXISTING,
;FILE_ATTRIBUTE_NORMAL,
;NULL

next:
invoke GetFileSize,fHand, sizef

mov filez,eax


invoke wsprintf,addr buf,addr ifmt,eax
getstd
invoke WriteConsole,displayh,addr buf,sizeof buf,0,0
;invoke MessageBox, 0, addr buf, addr buf, MB_OK
invoke WriteConsole,displayh,addr crlf,2,0,0
invoke Sleep,2000
.if Bufferlen != 0
jmp quit
.else

mov filez,0
jmp next
.endif
quit:
Ret
getsize EndP
end start




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 30 июля 2008 11:04
· Личное сообщение · #2

Порциями - скачиваешь одну, создаешь (файл с любым форматом) записываешь, новые полученные порции данных
в этот файл, когда файл скачается переименовываешь его в обычный формат.

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes





Ранг: 124.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 30 июля 2008 11:08
· Личное сообщение · #3

юзай сокеты. будешь формировать пакет как тебе нужно, ну и возобновлять с нужного места



Ранг: 103.1 (ветеран), 3thx
Активность: 0.070.01
Статус: Участник

Создано: 30 июля 2008 12:23
· Личное сообщение · #4

www.faqs.org/rfcs/rfc2616.html

-----
Crack your mind, save the planet





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 30 июля 2008 13:25
· Личное сообщение · #5

Сначала узнаешь размер скачанного файла , далее создаешь файл с таким же размером и забиваешь его любимыми тебе символами. Далее начинаешь скачку ...качаешь и записываешь считая сколько пришло ...когда будет обрыв или остановка то файл у тебя сохранится , часть его , и часть твоих забитых символов. Далее можно востановить закачку с места где остановились ...например расчитывая оффсет к твоим символам узнаем размер закачанного и место старта. Ну уже меню делать чтоб управление красивое было это твоя задача. Далее после закачки, если что то не пашет , можно сравнение сделать как бы опять закачивая и сравнивая поврежденные места. Все =) Ну а закачка через хттп идет такая же как и обычно, просто те реализовать дополнительную часть надо выше описанную.

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 10.6 (новичок)
Активность: 0=0
Статус: Участник

Создано: 01 августа 2008 05:34
· Личное сообщение · #6

Ок, а как установить указатель, чтобы скачивать файл не с начала а с определенного места. У меня чето не получается использовать функцию InternetSetFilePointer.... есть другие способы?




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 01 августа 2008 10:55
· Личное сообщение · #7

ewgeny1987 используй WinsockAPI

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 04 августа 2008 07:25
· Личное сообщение · #8

ewgeny1987, через socket API нужно делать. Сначала устанавливаешь TCP соединение а потом HTTP протокол. Писать такое надо как минимум на С, а то ты просто замучаешься с асинхронными WSASend(), WSARecv() и потоками.

Кста, кода немеряно - смотри на codeproject.com


 eXeL@B —› Программирование —› Как сделать скачивалку файлов на ассемблер по http c возможностью докачки
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати