Привет всем, вот пишу качалку на fasm'e и возник вопрос, а как можно распределить канал одинаково на несколько закачек, у меня если запустить 2-е то одна здыхает а вторая так же качается при том и на SOCKS и на обычном WinInet функционале, хотя скорость 128кб\с в Maxthone\FF\IE несколько вообще лихо идут... Вот кусок кода: Код (Text): proc HTMLDownLoadFileFromUrl htab, Url, FileName locals InternetHandle dd 0 ; := InternetOpen; FileHandle dd 0 ; := InternetOpenUrl; hfile dd 0 ; := Handle File; file_size dd 0 ; Ðàçìåð ôàéëà íà ñåðâåðå dwResult dd 0 ; Ðåçóëüòàò ÷òåíèÿ ñ íåòà BytesReads dd 0 dwBuffer dd 0 hBuffer dd 0 BytesRead dd 0 len_buf dd 0 dwBufferLen dd 0 dwIndex dd 0 BytesRead dd 0 endl .init_item: mov [dwBufferLen], 20 mov [len_buf], 1024*2 xor eax, eax mov [BytesReads], eax invoke VirtualAlloc, 0, 1024*2, MEM_COMMIT, PAGE_READWRITE test eax, eax je .memory_error mov [dwBuffer], eax ; invoke SendMessage, [htab], WM_SETTEXT, 0, status.load ; stdcall SetListView,[IndexItem],4,status.load .open_net: invoke InternetOpen, szAgent, 0, 0, 0, 0 test eax, eax jz .internet.error mov [InternetHandle],eax .open_url: invoke InternetOpenUrlA, [InternetHandle], [url], 0, 0, 0, 0 ;INTERNET_FLAG_DONT_CACHE test eax,eax jz .internet.error.url mov [FileHandle],eax .get_size: lea eax, [dwIndex] push eax lea eax, [dwBufferLen] push eax invoke HttpQueryInfo, [FileHandle], HTTP_QUERY_CONTENT_LENGTH, [dwBuffer];, dwBufferLen, dwIndex test eax, eax jz .not_indent_file_size mov esi, [dwBuffer] call atoi mov [file_size], eax invoke Sleep, 200 .set_data: invoke SendMessage, [htab], FM_SETFILESIZE, 0, [file_size] ; stdcall SetListView,[IndexItem],1,[dwBuffer] .create_file: invoke _lcreat, [FileName], NULL mov [hfile], eax .loading: lea esi, [BytesRead] invoke InternetReadFile, [FileHandle], [dwBuffer], [len_buf], esi mov [dwResult], eax cmp [BytesRead], 0 je .test_read_result .write_file: invoke _lwrite,[hfile],[dwBuffer],[BytesRead] add [BytesReads], 1024*2 invoke SendMessage, [htab], FM_SETBYTESREADS, 0, [BytesReads] jmp .loading .test_read_result: cmp [dwResult], TRUE je .close_file jmp .loading .close_file: push [hfile] call [CloseHandle] .close_url: push [FileHandle] call [InternetCloseHandle] .close_net: push [InternetHandle] call [InternetCloseHandle] .free_item: invoke VirtualFree, [dwBuffer], 1024*2, MEM_RELEASE ret .not_indent_file_size: invoke GetActiveWindow invoke MessageBox, eax, _error_size, 0, MB_ICONERROR jmp .create_file .internet.error.url: invoke GetActiveWindow invoke MessageBox, eax, _error_url, 0, MB_ICONERROR xor eax, eax ret .internet.error: invoke GetActiveWindow invoke MessageBox, eax, _error_open, 0, MB_ICONERROR xor eax, eax ret .error_init: invoke GetActiveWindow invoke MessageBox, eax, _error_open, 0, MB_ICONERROR xor eax, eax ret .memory_error: invoke GetActiveWindow invoke MessageBox, eax, _error_memory, 0, MB_ICONERROR ret endp
Вызывай InternetReadFile() небольшими кусками и замеряй время и traffic. Тебе надо реализовать очередь закачек и в ней "выдавать данные" файлам в зависимости от приоритета/ограничений/etc.
если через сокеты, то можно, например, процедуре кача передавать указатель на массив сокетов(кол-во коих соответствует кол-ву закачек) и по очереди вызывать recv в небольшой буфер для каждой закачки. InternetReadFile не по-дзенски.