Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [VB6] errore scaricando da internet la 16382esima pagina simile alle precedenti

    salve . . un saluto a tutto il forum . .
    mi sono appena registrato per esporvi un mio problema che da qualche tempo mi assilla

    Da circa 1 anno uso questo codice in VB6 per leggere/scaricare delle pagine web contenenti
    dati di profili utente su internet. Si tratta di giocatori di un videogioco flash online.
    Una volta raccolti tutti questi dati tiro fuori delle classifiche da mostrare agli stessi giocatori.

    Tutto funzionava correttamente . . il codice passava alla sub GetUrlSource il link
    della pagina e il nome del file sull'hd locale in cui memorizzare la pagina,
    prendere i dati necessari (una decina di valori numerici su partite vinte,
    sconfitte pareggi ect ect) . . e poi cancellare il file dal mio disco fisso.

    Il codice prevede oppurtuni ritardi e pause nella lettura per non ingolfare troppo
    la procedura di lettura delle pagine dal server del gioco.

    Ma da quando i giocatori da gestire sono diventati più di 16381 . . mi esce fuori un
    problema strano.

    Nel codice seguente infatti improvvisamente alla 16382esima invocazione della Sub seguente
    l'handle della connessione diventa = ZERO mentre prima ha sempre un valore tipo 13367033

    la variabile che si azzera è lSession

    di conseguenza il file generato sul mio hd diventa vuoto è il programma va in errore.
    Questo succede anche cambiando il link (sUrl) e cercando di leggere una pagina già letta
    in precedenza correttamente.

    Che succede dopo 16382 cicli usando il componente Inet?
    Microsoft Internet Trasfer Control 6.0
    . . qualcosa . . qualche buffer si intasa? . . come posso rimediare senza
    stravolgere tutto il codice?

    Se chiudo il programma e lo faccio riavviare dal punto in cui si è bloccato, tutto
    continua correttamente fino alla fine ma siccome ci vogliono ore per leggere tutte
    quelle pagine spesso il problema si verifica il mia assenza e quindi i dati totali
    letti rischiano di essere aggiornati con troppa differenza di tempo tra il primo e l'ultimo

    eccole dichiarazioni iniziali e la sub dove si verifica il pasticcio:
    (grazie per l'attenzione)

    codice:
    Private Const IF_NO_CACHE_WRITE = &H4000000
    Private Const BUFFER_LEN = 256
    
    Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
    Private Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" (ByVal hInternetSession As Long, ByVal sUrl As String, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
    Private Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer
    Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer
    
    . . . 
    
    Sub GetURLSource(sUrl As String, fileSulPC As String)
    
      Dim sBuffer          As String * BUFFER_LEN
      Dim sData            As String
      Dim lInternet        As Long
      Dim lSession         As Long
      Dim lReturn          As Long
        
      DoEvents
      
        'prendo l'handle della connessione corrente
        lSession = InternetOpen("vb wininet", 1, vbNullString, vbNullString, 0)
      
      'prendo l'handle dell'URL
      If lSession Then lInternet = InternetOpenUrl(lSession, sUrl, vbNullString, 0, IF_NO_CACHE_WRITE, 0)
     
    '-------------------------------------------------------------------------------   
      ' dopo 16381 chiamate a questa sub  . . lSession diventa =0
    '-------------------------------------------------------------------------------
     
      'se c'è l'handle dell'URL passo alla lettura della pagina
      If lInternet Then
        Call InternetReadFile(lInternet, sBuffer, BUFFER_LEN, lReturn)
        sData = sBuffer
        Do While lReturn <> 0
          Call InternetReadFile(lInternet, sBuffer, BUFFER_LEN, lReturn)
          sData = sData + Mid$(sBuffer, 1, lReturn)
        Loop
      End If
      
      Call InternetCloseHandle(lInternet)   'chiudo l'URL
      
      Open fileSulPC For Binary As #9
          Put #9, , sData
      Close #9
    End Sub
    Ultima modifica di MItaly; 07-01-2014 a 14:53 Motivo: tag CODE

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,345
    Mi sembra che dopo la

    Call
    InternetCloseHandle(lInternet)

    manchi una


    Call
    InternetCloseHandle(lSession)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Mi sembra che dopo la

    Call
    InternetCloseHandle(lInternet)

    manchi una


    Call
    InternetCloseHandle(lSession)
    oh bene . . se ci vuole ce la mettiamo . . quindi in effetti il codice mi apriva tantissime
    sessioni di internet senza mai chiuderle . .

    e . . solo alla 16382 esima aperta si saturava tutto e andava in TILT?

    non vedo l'ora di provarla ora che rientro a casa . . . vi farò sapere . . intanto GRAZIE 1000

  4. #4
    bene . . ho aggiunto la riga di codice consigliata da Oregon ed ho avviato il programmnino alle 10 di stamattina . . il passaggio critico della 13882 esima pagina è stato superato . . ora siamo quasi alla pagina n.30000 . . e tutto sembra procedere bene . . forse il problema è risolto . . grazie ancora

  5. #5
    16383 come numero non mi stupisce... è 2^15-1, per cui è il range di un intero a 16 bit con segno, probabilmente la API che stai usando ha una tabella di connessioni con range limitato da qualche intero a 16 bit (o comunque sembrava un buon "numero tondo" da usare come limite).
    Ultima modifica di MItaly; 09-01-2014 a 18:01
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.