Newsgroup: it.comp.lang.visual-basic
Titolo: Winsock e DataArrival

Ciao a tutti.
Ho creato un'applicazione client e una server su rete TCP sfruttando
ovviamente il winsock.
Tutto funziona bene ma non riesco alcune cose. Sul client c'č un pulsante
"disconnetti": vorrei che alla pressione di questo tasto il server "si
accorgesse" della disconnessione. Per fare questo ho associato al pulsante
disconnetti il codice
    Dim codice As String
    codice = "+++"
    wskClient.SendData codice
    wskClient.Close
La cosa strana č che il server non "sente" arrivare il codice (non dipende
dal codice ho fatto prove anche con "pippo"), cioč non si attiva l'evento
DataArrival.
Ho fatto alcune prove con una InputBox nella quale scrivevo il codice di
disconnessione e provavo a vedere se il server "sentiva" arrivare il codice.
Beh, il server sente arrivare il codice (cioč si attiva l'evento
DataArrival) solo se nella InputBox premo Invio (e non per esempio se clicco
su OK), in piů arrivano tutti gli altri dati che avevo provato
precedentemente. In pratica i dati vengono trasmessi ma l'evento DataArrival
si attiva solo quando do Invio nella InputBox!!! Ma in un'altra parte del
programma tutto funziona bene (con SendData e DataArrival e apparentemente
non c'č nessuna differenza)!!!!
Qualcuno mi sa spiegare a cosa puň essere dovuto?
Thanx
giaconet

 DataArrival.
[...]
Forse la
    wskClient.Close
dovresti metterla nell'evento SendComplete...
O per lo meno prova...

ciao
probabilmente le istruzioni di invio e di chiusura di connessione sono troppo
"vicine"... i dati non fanno a tempo a partire che si chiude la connessione!
non č che da lato server si puo' testare con lo stato se la connessione č stata
chiusa?
saluti
gualty
(sito Linux)
http://digilander.iol.it/ngappunti
-- 
Posted from  [213.140.11.7] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG


Non credo che dipenda dalla vicinanza delle istruzioni. Ho provato infatti
anche il seguente codice:
Dim codice As String
Do
    codice = InputBox("Codice di disconnessione")
    wskClient.SendData codice
Loop Until codice = "ciao"
wskClient.Close
Sul server ho fatto girare una procedurina che mi avvisava ogni volta che
l'evento DataArrival veniva invocato e mi visualizzava anche cosa era
arrivato. Bene. L'evento DataArrival non veniva mai invocato tranne quando
invece di cliccare su OK nella InputBox, davo Invio, e sul server mi
visualizzava tutta la coda di stringhe che avevo immesso precedentemente.
Faccio un esempio:
(InputBox) Codice di disconnessione: (scrivo) pippo (clicco su OK)
(server) Niente, muto.
(InputBox) Codice di disconnessione: (scrivo) +++ (clicco su OK)
(server) Niente, muto.
(InputBox) Codice di disconnessione: (scrivo) cazzo! (do Invio)
(server) pippo+++cazzo! (è stato invocato l'evento DataArrival)
Beh, spero proprio che qualcuno mi aiuti!!
Thanx
giaconet


Prova a dargli per codice disconnessione una stringa di almeno 40
caratteri.
Inoltre imposta il server per restituire a sua volta una stringa al
client per l'accettazione della disconnessione; questa stringa servirà
per sbloccare un ciclo DoEvents di attesa e processare l'istruzione
successiva di chiusura. Il server a questo punto potrà reagire in 2
modi:
1. Chiudere la connessione dopo un tempo di timeout definito (es:60
sec) (il classico TIME-WAIT di netstat)
2. Lasciare aperta la connessione in attesa di nuove richieste
(chiaramente si intende la connessione ad una determinata porta del
tcp-ip).
--
Ciao!
Davide

 wskClient.Close
ciao. 
il fatto è che fino a quando non esci dalla procedura , il control non manda
nulla, se non metti DoEvents:
prova questa:
Dim codice As String
 Do
     codice = InputBox("Codice di disconnessione")
     wskClient.SendData codice
     DoEvents
 Loop Until codice = "ciao"
 
 wskClient.Close
dimmi se funziona


 gualty
OK! Ma qual è l'evento che resta appeso se non esco dalla procedura (o non
faccio DoEvents)? E' solo una curiosità...qualcosa del winsock immagino.
Cmq grazie, sei stato di grande aiuto.
Bye
giaconet

di fatto, essendoci un doevents che risolve il problema, un evento "in piedi"
c'e'... quale sia lo sa solo microsoft!!! (almeno, dall'help di vb non si
deduce.. forse navigando su motori di ricerca in rete qualcosa si trova... se
ti interessa, buona navigazione!!!


 DataArrival.
Prova semplicemente a fare codice = "+++" & vbCrLf
-- 
Samuele Battarra
prova il mio newsreader:
http://digilander.iol.it/battarsa/programmi/news/

 wrote in message
news:29200.2001...@news.libero.it...

Grazie, avevo già provato.Cmq ho risolto con il suggerimento di Gualtiero.
Bye
giaconet

ti interessa, buona navigazione!!!
Se ti riferisci al DoEvents dovrebbe essere (se non erro) la funzione
di aggiornamento degli oggetti nel form... in poche parole ti permette
di interagire con gli oggetti della gui anche durante un loop infinito
(come in questo caso).
--
Ciao!
Davide

 wrote in message
news:3bea4d62...@News.CIS.DFN.DE...

C'è stato un misunderstandig. Credo che Gualtiero sappia bene cosa fa
DoEvents.
Il mio problema era che se hai una procedura tipo
Private Sub ...
    wskClient.SendData "Ciao mamma"
End Sub
L'invio della stringa sulla connessione avviene al momento del End Sub
(quando il controllo esce dalla routine).
Il mio problema era:
Private Sub ...
    wskClient.SendData "Ciao mamma"
    wskClient.Close
End Sub
Allora al momento dell'End Sub la connessione era chiusa e non inviava
nulla.
La soluzione era:
Private Sub ...
    wskClient.SendData "Ciao mamma"
    DoEvents
    wskClient.Close
End Sub
E tutto funziona! Ci chiedevamo allora quale era l'evento "appeso", per il
quale era necessario DoEvents.
Bye
giaconet

 wrote in message
9s609j$10hspl$1...@ID-71483.news.dfncis.de...

hai provato a timerizzare l'operazione ad esempio a 5sec.
con un timer..
probabile che chiudi il socket prima che l'operazione venga conclusa ....