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

Uso il controlli Winsock per un'applicazione client/server, ma mi accade una
cosa stranissima...
il server fornisce servizi su piu' porte. Se mi collego con un client alla
volta tutto funziona bene.
Se mi collego con due client, e effettuo due operazioni diverse (sia su
porte diverse che sulla stessa porta) contemporaneamente, uno dei due client
si blocca (e' come se non gli arrivasse niente dal server). Potrebbe
sembrare un errore di programmazione (e ci potrebbe stare), ma la cosa
strana e' che se eseguo il debug, andando passo passo, tutto funziona
perfettamente!!!
La cosa che ho notato e' che se sul server faccio una senddata , l'evento
dataarrival nel client non viene sollevato subito, ma solo dopo che la
procedura del server da cui ho fatto la senddata e' finita. Come mai? c'e'
un modo di evitarlo?
Non so' se sono riuscito a spiegarmi bene..
Vi faccio un esempio, sperando di riuscire ad essere piu' chiaro.
L'applicazione e' un sistema di gestione di una biblioteca.
Ho due tipi di client, quello degli utenti (che lo usano per chiedere in
prestito un libro) e quello dei gestori (al quale tra le altre cose deve
essere segnalato quando un utente ha chiesto un prestito).
Le cose funzionano cosi:
-il client chiede il prestito
-il server registra questa operazione su un db locale
-il server invia la segnalazione a tutti i gestori collegati per avvertirli
dell'avvenuto prestito
-il server finisce il colloquio con il client utente (non fa' la close,
perche' questa la fa' il client, semplicemente deve inviare un messaggio per
far capire al client che e' andato tutto bene)
quindi il server fa':
-senddata msg sul socket a cui e' collegato il gestore
-un po' di operazioni
-senddata msg sul socket a cui e' collegato l'utente
in pratica la senddata msg verso l'utente e' come se non partisse.. sul
software utente non viene sollevata la dataarrival.
Se pero' faccio un'altra operazione su un qualsiasi altro socket allora mi
si risveglia anche il client (cioe' l'invio del msg. e' come se venisse post
icipato, ma non riesco nemmeno a capire cos'e' che poi lo fa partire)
Se pero' faccio il debug e eseguo le operazioni passo passo allora va' tutto
a posto.
Per i test sto' facendo girare il prg. in locale su una sola macchina,
quindi tutto sull'indirizzo 127.0.0.1
Potrebbe essere questo il problema?
(a me sembra che il problema sia di velocita', infatti se faccio le cose
passo passo rallento, e quindi tutto funziona al meglio)
So di essermi spiegato malissimo, comunque confido lo stesso nell'esperienza
di qualcuno per risolvere il problema...
Grazie mille!!
--
Bye Bye by
/MetalmaN\

un modo di evitarlo?
questo succederebbe anche col client...
per ovviare al problema semplicemente basta usare la funzione DoEvents
subito dopo senddata...
es:
winsock_ocx.SendData "roba_che_mando"
DoEvents
byez

Purtroppo non sono in grado di aiutarti. Posto qui, però, perché penso di
avere un problema simile al tuo. Il mio problema è che non riesco a mettere
in comunicazione più di un client. Premetto che per ogni connessione replico
il controllo winsock, che tutti i controlli usano la stessa porta e che ho
avuto modo di testare l'applicazione solo sullo stesso PC (127.0.0.1).
In pratica, dopo la connessione del primo client avvenuta con successo, il
secondo non ottiene risposta dal server, pur avendo ben cinque controlli in
ascolto. In effetti, non scatta nemmeno l'evento ConnectionRequest del
server, quindi non credo che sia un problema di codice (oltretutto la prima
connessione avviene sempre con successo).
Che altro posso dire: speriamo che qualcuno ci aiuti.
Ciao.
--
Paolo De Laurentiis
E.Mail 1: 
pd...@tin.it
E.Mail 2: 
pd...@tiscalinet.it
HomePage 1: 
http://space.tin.it/io/pdelau
HomePage 2: 
http://www.freeweb.org/freeweb/pdelau
ICQ# 12774436

Sul sito comune trovi un esempio con due progetti: uno per il server ed uno
per il client.
Nel codice trovi dei commenti che spiegano alcuni trucchetti da usare per
far funzionare il controllo Winsock.
Richiede VB5.