Newsgroup: it.comp.lang.visual-basic
Titolo: invio dati con Winsock

Salve a tutti!
Mi sto cimentando nella creazione di un  pacchetto per il trasferimento di
dati tra vari pc remoti.
In particolare ho creato due programmini uno client ed uno server (sulla
falsa riga dell'esempio sul controllo Winsock presente nel sito comune). Il
programma client richiede una connessione al server che gli assegna la prima
porta disponibile; stabilita la connessione l'attività predominante dovrà
essere quella dell'invio (quasi simultaneo) di un certo numero di dati
(uguali per tutti i clients) dal server ai vari clients ad intervalli
prefissati.
Per poter mantenere sul server la connessione attiva con i clients creo un
vettore di controlli winsock che si incrementa ogni qualvolta viene attivata
una nuova connessione. I controlli winsock che possono essere creati hanno
un indice che va da 1 al numero massimo di porte disponibili; per mantenere
traccia delle connessioni mi creo un altro vettore di appoggio definito in
questo modo:
dim VettoreConnessioni(NumeroMaxPorte) as integer
che aggiorno in parallelo tenendo conto delle seguenti regole:
WinSock(1) => (connessione attiva della prima porta) =>
VettoreConnessioni(1) =1
(porta N non attiva) => (non è presente alcun controllo winSock) =>
VettoreConnessioni(N) =0
Nel momento in cui devo inviare i miei dati ai clients eseguo un ciclo del
tipo:
dim i as integer
for i=1 to NumeroMaxPorte
 (*)   if VettoreConnessioni(i)=1 then WinSock(i).SendData "Stringa da
inviare"
Next i
Il mio problema nasce qui!
in quanto il server, non si so come e nè perchè, mi invia la stringa solo
all'ultimo client connesso ma la cosa più strana e che se inserisco un punto
di interruzione nel codice dove c'è (*) facendo eseguire manualmente (in
runtime) il ciclo passo passo, i dati mi vengono inviati a tutti i
clients!!!!
Come mai?
E' possibile che la velocità di esecuzione del ciclo salti l'invio dei dati?
Come posso risolvere questo inconveniente tenedo presente che i dati inviati
devono essere trasferiti quasi simultaneamente a ciascun clients?
C'è qualche altro modo più efficente per risolvere il mio problema?
Spero che vi siano chiare le mie richieste e spero anche che qualcuno di voi
possa darmi una mano!!!
Rimango in attesa di vostre risposte e vi ringrazio anticipatamente

 clients!!!!
La butto lì, il Winsock ha l'evento sendcomplete, prova a mettere un loop
che rimanga in attesa di un flag... esempio:
_____________________
' da dichiarare in Generali
flagInvioTerminato as Boolean
' Inserisci nell'evento
Private Sub WS_SendComplete(Index As Integer)
flagInvioTerminato=True
End Sub
for i=1 to NumeroMaxPorte
  if VettoreConnessioni(i)=1 then WinSock(i).SendData "Stringa da inviare"
flagInvioTerminato = False ' lo setti a falso
while flagInvioTerminato = False
' ...poi aspetti che diventi vero
    doevents
wend
Next i
________________
Per essere precisi, dovresti anche mettere un timeout e un controllo
di errore. E per occupare meno CPU, dovresti usare una Sleep al posto
del DoEvents... L'ho scritta al volo, comunque fammi sapere se risolve.
Bye, G.
--
---------------------------------------------
    Le risposte alle tue domande le trovi
    sul Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
       ... e nell'help in linea !
---------------------------------------------
Real E-address: 
gaet...@hotmail.com

 La butto lě, il Winsock ha l'evento sendcomplete, prova a mettere un loop

Grazie tante sei un mito :))!!!
Perfetto...!!!!           non mi ero proprio calcolato l'evento
winsock_SendComplete()
un ultima domandina mi hai accennato di utilizzare uno Sleep al posto di
DoEvent ... in che modo?
Ti ringrazio ancora!

 DoEvent ... in che modo?
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
' questa blocca il tuo programma per un tempo di N millisecondi
La chiami semplicemente con (esempio):
Sleep 500 ' mezzo secondo
