Распределение канала

Тема в разделе "WASM.NETWORKS", создана пользователем dgs, 28 июн 2009.

  1. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Привет всем, вот пишу качалку на fasm'e и возник вопрос, а как можно распределить канал одинаково на несколько закачек, у меня если запустить 2-е то одна здыхает а вторая так же качается при том и на SOCKS и на обычном WinInet функционале, хотя скорость 128кб\с в Maxthone\FF\IE несколько вообще лихо идут... Вот кусок кода:
    Код (Text):
    1. proc HTMLDownLoadFileFromUrl htab, Url, FileName
    2.  
    3.      locals
    4.         InternetHandle dd 0           ; := InternetOpen;
    5.         FileHandle     dd 0           ; := InternetOpenUrl;
    6.         hfile          dd 0           ; := Handle File;
    7.         file_size      dd 0           ; Ðàçìåð ôàéëà íà ñåðâåðå
    8.         dwResult       dd 0           ; Ðåçóëüòàò ÷òåíèÿ ñ íåòà
    9.         BytesReads     dd 0
    10.         dwBuffer       dd 0
    11.         hBuffer        dd 0
    12.         BytesRead      dd 0
    13.         len_buf        dd 0
    14.         dwBufferLen    dd 0
    15.         dwIndex        dd 0
    16.         BytesRead      dd 0
    17.       endl
    18.  
    19.       .init_item:
    20.         mov     [dwBufferLen], 20
    21.         mov     [len_buf], 1024*2
    22.         xor     eax, eax
    23.         mov     [BytesReads], eax
    24.  
    25.         invoke  VirtualAlloc, 0, 1024*2, MEM_COMMIT, PAGE_READWRITE
    26.         test    eax, eax
    27.         je      .memory_error
    28.  
    29.         mov     [dwBuffer], eax
    30.       ;  invoke  SendMessage, [htab], WM_SETTEXT, 0, status.load   ;   stdcall SetListView,[IndexItem],4,status.load
    31.  
    32.       .open_net:
    33.         invoke  InternetOpen, szAgent, 0, 0, 0, 0
    34.         test    eax, eax
    35.         jz      .internet.error
    36.         mov     [InternetHandle],eax
    37.  
    38.       .open_url:
    39.         invoke  InternetOpenUrlA, [InternetHandle], [url], 0, 0, 0, 0       ;INTERNET_FLAG_DONT_CACHE
    40.         test    eax,eax
    41.         jz      .internet.error.url
    42.         mov     [FileHandle],eax
    43.  
    44.       .get_size:
    45.         lea     eax, [dwIndex]
    46.         push    eax
    47.         lea     eax, [dwBufferLen]
    48.         push    eax
    49.         invoke  HttpQueryInfo, [FileHandle], HTTP_QUERY_CONTENT_LENGTH, [dwBuffer];, dwBufferLen, dwIndex
    50.         test    eax, eax
    51.         jz      .not_indent_file_size
    52.         mov     esi, [dwBuffer]
    53.         call    atoi
    54.         mov     [file_size], eax
    55.         invoke  Sleep, 200
    56.  
    57.       .set_data:
    58.         invoke  SendMessage, [htab], FM_SETFILESIZE, 0, [file_size]   ; stdcall SetListView,[IndexItem],1,[dwBuffer]
    59.  
    60.       .create_file:
    61.         invoke  _lcreat, [FileName], NULL
    62.         mov     [hfile], eax
    63.  
    64.       .loading:
    65.         lea     esi, [BytesRead]
    66.         invoke  InternetReadFile, [FileHandle], [dwBuffer], [len_buf], esi
    67.         mov     [dwResult], eax
    68.         cmp     [BytesRead], 0
    69.         je      .test_read_result
    70.  
    71.       .write_file:
    72.         invoke  _lwrite,[hfile],[dwBuffer],[BytesRead]
    73.         add     [BytesReads], 1024*2
    74.         invoke  SendMessage, [htab], FM_SETBYTESREADS, 0, [BytesReads]
    75.         jmp     .loading
    76.  
    77.       .test_read_result:
    78.         cmp     [dwResult], TRUE
    79.         je      .close_file
    80.         jmp     .loading
    81.  
    82.       .close_file:
    83.         push    [hfile]
    84.         call    [CloseHandle]
    85.  
    86.       .close_url:
    87.         push    [FileHandle]
    88.         call    [InternetCloseHandle]
    89.  
    90.       .close_net:
    91.         push    [InternetHandle]
    92.         call    [InternetCloseHandle]
    93.  
    94.       .free_item:
    95.         invoke  VirtualFree, [dwBuffer], 1024*2, MEM_RELEASE
    96.         ret
    97.  
    98.       .not_indent_file_size:
    99.         invoke  GetActiveWindow
    100.         invoke  MessageBox, eax, _error_size, 0, MB_ICONERROR
    101.         jmp     .create_file
    102.  
    103.       .internet.error.url:
    104.         invoke  GetActiveWindow
    105.         invoke  MessageBox, eax, _error_url, 0, MB_ICONERROR
    106.         xor     eax, eax
    107.         ret
    108.  
    109.       .internet.error:
    110.         invoke  GetActiveWindow
    111.         invoke  MessageBox, eax, _error_open, 0, MB_ICONERROR
    112.         xor     eax, eax
    113.         ret
    114.  
    115.       .error_init:
    116.         invoke  GetActiveWindow
    117.         invoke  MessageBox, eax, _error_open, 0, MB_ICONERROR
    118.         xor     eax, eax
    119.         ret
    120.  
    121.       .memory_error:
    122.         invoke  GetActiveWindow
    123.         invoke  MessageBox, eax, _error_memory, 0, MB_ICONERROR
    124.         ret
    125. endp
     
  2. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Исходник:http://narod.ru/disk/10360661000/VKLife%20(copy%203).rar.html
     
  3. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Вызывай InternetReadFile() небольшими кусками и замеряй время и traffic. Тебе надо реализовать очередь закачек и в ней "выдавать данные" файлам в зависимости от приоритета/ограничений/etc.
     
  4. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    А автоматом это разве нельзя?
     
  5. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    если через сокеты, то можно, например, процедуре кача передавать указатель на массив сокетов(кол-во коих соответствует кол-ву закачек) и по очереди вызывать recv в небольшой буфер для каждой закачки. InternetReadFile не по-дзенски.