Newsgroup: it.comp.lang.visual-basic
Titolo: [URGENTE] Gestire risposta CGI da server UNIX!

Già tempo fa avevo postato una cosa in merito, ma non avevo trovato risposta
al mio problema: oggi ho scoperto qualche indizio in più e ci riprovo.
L'applicazione in esame, tramite un controllo Inet, lancia una Query verso
una CGI, e ne raccoglie la risposta col metodo GetChunk. Fino a poco tempo
fa, finchè, cioè il server che conteneva la CGI era un server Windows, tutto
filava liscio come l'olio. Da quando la CGI è stata migrata su un server
UNIX, invece incappo nel seguente problema: la GetChunk non riesce più a
scaricare i dati dal Buffer a blocchi di 1024 (come specificato), ma attende
che il buffer abbia catturato tutta la risposta (si tratta di 20-30
Mb!!!!!!) e poi la scarica. Questo non solo dilata mostruosamente i tempi,
ma talvolta genera un errore la cui descr4izione è "Impossibile Recuperare i
Dati". Ora l'unica differenza che mi viene in mente ci possa essere tra le
risposte di Win e di UNIX sono i terminatori delle righe (Lf pittosto che
Lf+Cr), ma non so come porvi rimedio, dato che non ho troivato nulla per
dire al controllo Inet che dall'altra parte c'è un server UNIX!
Vi ringrazio davvero, perchè sono alla disperazione!!!
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 nulla per dire al controllo Inet che dall'altra parte c'č un server UNIX!
Non č che da qualche parte utilizzi "line input"? Se sě č quello.
Se no, posta un po' di codice.
termoPilucco

 Se no, posta un po' di codice.
Ecco qui! Il problema nasce proprio sulla Inet.GetChunk: non becca i blocchi
di 1024, ma un unico blocco gigante!
'------------CODICE---------
Private Sub Inet_StateChanged(ByVal State As Integer)
    [...]
    Select Case State
        Case icResponseCompleted Or icResponseReceived
            vtData = Inet.GetChunk(1024, icString)
            DoEvents
            Do While Not bDone
                Print #FileNUM, vtData;
                vtData = vbNullString
                DoEvents
                ' Recupera il blocco successivo.
                vtData = Inet.GetChunk(1024, icString)
                If Len(vtData) = 0 Then
                   bDone = True
                End If
            Loop
    [...]
       Case Else
    [...]
'------------FINE CODICE---------
Grazie!!!


"P@olo"  ha scritto nel messaggio:
[...]
icString dovrebbe già tenere conto delle differenze di convenzioni dei vari
sistemi. Prova comunque icByteArray (ma son sicuro, l'hai già fatto).
Se proprio non ne esce nulla, drasticamente, prova ad utilizzare MSXML al
posto di inet... credo abbia le funzionalità che ti servono.
termoPilucco

 posto di inet... credo abbia le funzionalità che ti servono.
Tenterò! Mò mi cerco un po' di esempi su MSDN.


 posto di inet... credo abbia le funzionalità che ti servono.
Sbaglio o non si tratta di un'oggetto alla Inet? Sai dove trovare un po' di
documentazione per usarlo? IO dovrei fare un banalissimo POST....


 documentazione per usarlo? IO dovrei fare un banalissimo POST....
Devi cercarlo tra i riferimenti (non è un controllo).
Per fare un post basta istanziarlo ed eseguire qualcosa tipo:
myXML.open("POST", 
http://www.www.w
, true)
Quello che potrebbe fare la differenza nel tuo caso è l'ultimo parametro.
Determina se la richiesta deve essere sincrona o asincrona.
Tu dovresti farla asincrona, per evitare di aspettare tutto il
download/upload.
Quindi dovresti gestire anche gli eventi.
Per la documentazione, puoi usare quella fornita da microsoft insieme alla
libreria (devi selezionare l'SDK durante l'installazione).
Qui trovi il setup
http://tinyurl.com/aw2g
Tieni conto che magari MSXML non è il massimo per quello che devi fare
(nasce come libreria per la gestione dell'XML), ma l'inet control,
onestamente, è una delle cose peggiori di M$.
termoPilucco

 onestamente, è una delle cose peggiori di M$.
Ok, mi pare chiaro! Il lancio della Query mi pare abbastanza semplice,
adesso vedrò di capire come gestire le risposte! C'è però una questione, più
filosofica che altro, direi, che non mi è chiara:
Inet fa un po' schifo, e XML non è propriamete dedicato a questo tipo di
attività: e allora qual'è lo strumento più adatto per l'HTTP? Suppongo che
oggi come oggi le componenti "di rete" siano tra le più usate! MI viene il
dubbio che l'errore sia nella scelta di VB...
Ciao e ancora grazie!!!


 dubbio che l'errore sia nella scelta di VB...
Pur non avendolo ancora usato per queste cose, sospetto che .net sia
decisamente migliore sotto questo punto di vista.
termoPilucco

 decisamente migliore sotto questo punto di vista.
He he, per ora dispongo solo di VB6. Mi accontenterò!


 libreria (devi selezionare l'SDK durante l'installazione).
[...]
Ho seguito i tuoi consigli e mi sono spulciato un po' l'SDK per trovare un
esempio di codice per la gestione degli eventi di risposta. Tutto sembrava
ok fino alla prima prova sul campo:
l'istruzione XML.open viene eseguita correttamente con tanto di passaggio
nella routine di gestione degli stati (quella prelevata dall'SDK), ma poi il
comando XML.send mi restituisce un errore di Accesso Negato. Naturalmente ho
provveduto a compilare l'istruzione di Open con i paramatri relativi a UsrID
e Pwd relativi al mio account presso il server che interrogo:
XML.open "POST", 
10.10.10.10/query.exe...
.,True, UsrID , Pwd
La cosa buffa è che se con uno sniffer guardo cosa passa sulla rete, non
vedo alcun pacchetto in viaggio verso l'IP che dovrei interrogare. Sembra
quasi che l'errore sia interno all'applicazione. Ho letto qualcosa in
relazione ai livelli di protezione di Explorer, ma anche mettendo "livello
Basso" dappertutto la situazione non cambia!!!
Qualche idea?


Volevo ringraziarti per i consigli riguardo l'uso di XML al posto di Inet:
ho
bestemmiato un po', ma alla fine ho ottenuto ottimi risultati!!!!!
Ciao, P@olo.
