Newsgroup: it.comp.lang.visual-basic
Titolo: funzione wait o simile.

risalve a tutti...
ho qualche "piccolo" problemino con winsock...
faccio un piccolo esempio:
se ho due applicazioni che parlano tra di loro queste si dicono:
a) ciao come va' ?
b) bene grazie e tu ?
c) bene anche io. lavori oggi ?
d) si.
questa dovrebbe essere la sequenza corretta...
in realta' (per colpa del protocollo tcp mi dicono...)
le due applicazioni si dicono:
a) ciao come va'? bene anche io.lavori oggi ?
b) bene grazie e tu ?
a)
b) si.
ricolverei tutto se si potesse mettere una specie di "coso" che blocchi
l'applicazione anche solo per un secondo.
una cosa tipo "wait" o simili....
esiste qualche soluzione ?
grazie a tutti voi.

Non uso il controllo winsock, ma hai provato con l'api sleep?
O magari a vedere se esiste qualche evento che ti dice se è
arrivato un messaggio da socketA ... e attendi l'evento prima
di dire a socketB di parlare ancora?
Ciao Andrea

esiste qualche soluzione ?
Le comunicazioni winsock
possono essere gestite in due maniere differenti
una ASINCRONA :
Che è
quella utilizzata dal Controllo Winsock di Vb 
ed una SINCRONA:
che è
quella di default delle API di windows (se usi per ex. il C e la e
winsock32.lib (non è proprio così, ma è per semplificare))
(Rif: Cerca
su google Socket Blocking and Non Blocking mode WSAAsyncSelect)
In
realtà cio che a te serve è qualkosa che:
Invii un dato
Aspetti una
risposta
Invii il secondo dato se la risposta è quella che volevi
Immagino che tu stia creando una sorta di protocollo di autenticazione tra
la client e server
in vb con winsock control questo puo essere
implementato con l'utilizzo dei cosiddetti semafori indiretti (delle
semplici variabili di stato) 
Cioè tanto per capirci setti delle
variabili in base allo stadio di comunicazione in cui ti trovi ex..
nell'evento recive di winsock
Dim strBff as string
winsock.GetData(strBff)
if strBff="FRASE NUMERO 1" then
blResponseRecived=true
else
blResponserecived=false
end if
e poi
if blResponseRecived then
Winsock.sendata "Risposta alla prima frase"
end
if
alternativamente puoi fare così
winsock.getdata(myBUFF)
Select case  myBuff
case "1" ' la prima frase
E MANDI LA RISPOSTA
ALLA FRASE 1....
CAse "2" ' la seconda frase
E MANDI LA RISPOSTA ALLA
FRASE 2
CASE "3" ' la terza frase
MANDI LA RISPOSTA ALLA FRASE 3
END SELECT
Ovviamente se per te la gestione di evnti sincroni è una
regola e non è un eccezione ti consiglio di utilizzare le API di Winsock
che come ti ho detto ti mettono a disposizione la modalità sincrona di
dafault
With Best Regards 
Lorenzo
(NoMoreSecrets)
--------------------------------
Inviato via 
http://usenet.iol.it
 

 ha scritto:
Qualke messaggio più in la ho trovato questo link 
così puoi vedere cosa
intendevo prima per API Winsock:
http://www.vbip.com/winsock-
api/default.asp


acc...il problema e' proprio questo !
io nella mia totale ignoranza ho fatto una cosa del tipo:
' faccio una domanda al client
winsock.sendatata (domandona)
' aspetto che il client mi mandi la risposta
' e la processo...
winsock.getdata(risposta)
select case risposta
case 01
    risposta 01
case 02
    risposta 02
etc...
end select case.
' poi continuo con altre domande al client...e cosi via...
ora, e non so' spiegarmi il perche'....
al client arriva una stringa tipo:
domandona#rispostaXX
tutto insieme.
e' come se spedisse tutto il pacchetto insieme.
e' questo che non capisco.
tutto il programma e' strutturato con questi "semafori", eppure,
al client, o al server (le risposte arrivano anche dal client) arrivano
sempre pacchetti "composti" da piu' risposte.
eppure, esaminando il listato NON dovrebbero arrivare insieme, ma in momenti
separati.
la beffa e' che se interrompo il ciclo con dei msgbox Domandona in modo da
controllare cosa stia arrivando,
la stringa e' CORRETTA !
se commento la voce 'msgbox Domandona
la stringa che arriva e' SBAGLIATA ( del tipo domandona#rispostaXX)
ora provo a cercare "Socket Blocking and Non Blocking mode WSAAsyncSelect"
su google e vediamo cosa dice...
se avete altre idee...sono sempre qui...
e voi sempre genitlissimi...
grazie ancora per il prezioso aiuto.
<
lcer...@dnsitalia.com
 lorenzo (NoMoreSecrets)> wrote in message
news:213Z140Z5Z29Y1...@usenet.iol.it...


 ha scritto: 
Perchč
non posti il pezzo di codice?
cosě vediamo se ti posso dare una mano!
Molto spesso il problema che tu manifesti si verifica con le connessioni
loopback (quelle su 127.0.0.1) per intenderci ...
questo poichč l'invio e
la ricezione dei dati sono cosě veloci da generare levento dataarrival in
continuo ........
Il consiglio č quello di verificare che le variabili
siano pulite prima e dopo ogni inviio in modo da evitare la concatenazione
...
Ciao


Se vui un funzione wait prova questa api:
Private Declare Function SleepEx Lib "kernel32" (ByVal dwMilliseconds As
Long, ByVal bAlertable As Long) As Long