Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Errore su Socket

Ciao a tutti.
Mi connetto ad un server mediante controllo Winsock e ricevo correttamente i
dati ogni n secondi (circa 15).    Randomicamente il mio programma emette
l'errore :
40006 - Protocollo o stato della connessione errato per la transazione
richiesta o la richiesta.
L'errore viene emesso alla lettura del buffer mediante istruzione:
         WS(Index).GetData strData, vbString, bytesTotal
che č la prima istruzione dell'evento WS_DataArrival ovvero dell'evento che
scatta quando ci sono dati da leggere.
Ho verificato che il numero dei byte ricevuti sono esattamente quelli che mi
aspetto, lo stato della connessione deve essere necessariamente attivo
altrimenti l'evento non sarebbe scattato ed il protocollo lo forzo a
sckTCPProtocol al momento della Connect.
Non so + che pesci prendere.
Ciao e grazie
Stef

L'errore che tu segnali mi capitava con il mio client IRC se non eseguivo
istruzioni entro un determinato tempo.
Più precisamente il problema era questo:
Se tu non invii comandi di alcun genere al server (il tempo varia da server
a server) questo invia un ping al tuo client per verificare che tu sia
"vivo", se non rimandi indietro un comando "PONG" questo dopo 2/3 volte che
ti "pinga" ti disconnette e di conseguenza qualunque evento o comando
rimandi tramite sock genera questo errore.
Le soluzioni sono 2
1° al PING del server mandi un PONG del client
2° tramite un oggetto timer controlli costantemente lo stato del sock
(winsock.state) se è =0 vuol dire che in quel momento non sei connesso.
se è 7 vuol dire che sei connesso.
Per maggiori informazioni sugli stati del winsock guarda la guida di VB è
abbastanza chiara.
Ciao
                                 Pixel

La soluzione che mi hai proposto mi ha fatto identificare il problema.
Non è esattamente quello che dicevi tu ma è comunque legato alle
temporizzazioni dei task.
E' comunque molto interessante cercare di capire  perchè succede quanto ora
ti descrivo ;
ho un Simulatore di un server che gira sulla stessa macchina dove gira il
mio applicativo client.
L'indirizzo IP che ho impostato è 127.0.0.1, cioè il localhost definito nel
file hosts.
Il client effettua la sua brava "connect"
Scatta l'evento "ConnectionRequest" del server che in rapida successione
esegue  l'accettazione della connessione mediante "Accept" ed immediatamente
dopo esegue la prima "SendData" (21 byte)
....e qui scatta la cosa strana .....
viene attivato giustamente l'evento "DataArrival" del client ed il parametro
di input "ByteTotal" della procedura segnala esattamente 21 byte in coda.
La prima istruzione della sub relativa all'evento DataArrival è la "GetData"
che dovrebbe leggere i 21 byte e incredibilmente mi scatta l'errore che non
esiste connessione (....impossibile perchè è scattato l'evento di ricezione
dei dati, .....quindi la connessione esiste).
Per risolvere il problema (grazie al tuo suggerimento) ho inserito una Sleep
di 200 millisecondi tra la  accettazione della connessione del server
(Accept) e l'invio del primo pacchetto di dati.
Tutto funziona perfettamente.
Strano no ?
Comunque grazie
Stef

Mi viene da pensare una cosa....
tu fai girare l'applicativo in locale e di conseguenza non esiste ritardo
sulla risposta (+ o -)
In maniera diversa si comporta un Server IRC in quanto per ovvi motivi la
risposta client-server ha un ritardo.
Riportando il caso IRC al tuo credo che il problema possa risalire ad un
AUTOFLOOD...
Cioè..a livello IRC se tu sei troppo veloce nelle risposte o invii troppe
richieste contemporanee al server questo ti disconnette.
In poche parole credo (e ripeto credo) avvenga questo:
la velocità di risposta del tuo client è superiore a quanto è previsto dal
server e di conseguenza, impostando un ritardo sulla risposta hai superato
il problema.
Ciao...
                  Pixel