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

Salve a tutti, sono iniziando lo sviluppo di un'applicazione client/server 
un pň complessa nello specifico ho bisogno di capire bene come gestire piů 
connessioni tramite winsock ad un'applicazione server in attesa su una porta 
specifica.
Premetto che utilizzo il protocollo winsock regolarmente senza troppi 
problemi, credo di dover usare un array del controllo winsock mantenendo la 
stessa LocalPort ma non mi č chiaro come fanno i client a gestire le diverse 
connessioni ...
un aiuto sarebbe molto gradito.

 un aiuto sarebbe molto gradito.
F1
cerca winsock
ci son vari esempi
c'è anche un esempio di una chat...è esattamente quello che ti serve come
principio!

Nell'applicazione server devi mettere un winsock in stato listen, e un
array di winsock chiusi.
Quando al winsock in ascolto arriva una connection request, passi la
palla ad un qualsiasi winsock dell'array richiamandone il metodo
AcceptConnection (o qualcosa di simile) e passandogli l'ID della
richiesta.
Ovviamente ti conviene porre un limite al numero di connessioni in
ingresso sul server.
P.S.: Il winsock in ascolto utilizza una certa porta da te stabilita
(per esempio la 1234).
Quindi tutti i client contattano il server su quella porta, ma poi il
winsock in ascolto li redirige verso un altro winsock che ha la
LocalPort impostata a 0 e così i client in realtà si connettono sul
server ad una porta qualsiasi.
-- 
Quando noi ignoranti eravamo di più, tutto era più bello...
(A. Celentano)
Per rispondermi in privato, prima togli l'immondizia dalla testa ;)


Prego
Ric 

 array di winsock chiusi.
Attenzione! Non conviene mettere un array predefinito, perchè 
allocheresti risorse anche non utilizzandole.
Piuttosto metti solo un'istanza del controllo e poi lo istanzi n volte 
(con n massimo deciso da te)
bye

"Nicola Ottomano" ha scritto...

e non dimenticare di scaricarlo alla chiusura della connessione, altrimenti
crei un mangia risorse destinato ad impallarsi
-> GbC|
www.gbcweb.com

 il winsock NON è un protocollo!
CUT
In effetti il venerdì sera c'entra sul fatto che chiaramente il winsock non 
è un protocolo.
Farò tesoro dei suggerimenti, f1 per la guida me lo segno grazie (!)
Grazie a tutti voi. 

 
ha scritto nel messaggio 
news:1h3d26r.15cqg2x134e6e2N%seprano.antonio_im...@libero.it...

Ecco cosa mi mancava reindirizzare le connessioni grazie sei stato 
gentilissimo. 

 gentilissimo.
my2cents
Io non so se sia corretto operativamente consentire ad un client di
connettersi su una porta a caso!
Mi spiego meglio:
se io contatto un server di dati "autoprodotto" sulla porta 1234 in listen
io mi aspetto che mi risponda attraverso quella...
o tuttalpiù su un altra porta preposta.
Se ci svincoliamo da server "canonici"...possiamo anche dire come esempio
che alla 4662 tcp mi risponde emule ...e se voglio far prima 4672 UDP....
Il fatto di reindirizzare lo capisco come:
Ho un server centrale e 2 client...il server stabilisce una connessione
diretta fra i 2 client in particolari situazioni! (edonkey docet)
Perchè sono contro per principio alla libera riassegnazione delle porte?
Perchè in teoria (al di la di usi "ludici" e parlando di usi
"proooofessional") io dovrei avere nella mia rete un signor firewall
configurato parecchio bene!
Ed ai netAdmin già chiedere di aprire la porta 1234 è chiedere tanto!
Non capisco quindi la necessità di avere una redirezione di winsock quando
mi sembra funzioni parecchio bene il solito metodo dell'array di winsock!
per finire se vi serve ...una lista di porte usate dai server Microsoft
http://www.microsoft.com/italy/pmi/sicurezza/sgc/articles/ref_net_ports_ms_prod.mspx
Saluti!

 configurato parecchio bene!
Ma infatti questo me lo son sempre posto come un problema: la mia
soluzione per ora non ha dato problemi in quanto adottata principalmente
da me e basta ;) Cioè non ho dovuto dare a nessuno il mio software.
Però con problemi come quello del firewall, come si può fare in modo che
UNA applicazione server possa lasciare entrare più client
contemporaneamente sulla stessa porta?


 contemporaneamente sulla stessa porta?
Emh... qui c'č un ragionamento di fondo sbagliato. La domanda
č "perché cambiare la porta ?".
Lasciamo perdere VB, un attimo, e ragioniamo: un client che si
connette ad un "normale" web server lo fa sempre sulla stessa
porta 80, no ?
Eppure, non mi pare che ad un server web si possa connettere un
solo client alla volta...
Bye, G.

Infatti. Sul server c'č una applicazione che resta in ascolto sulla 80.
E piů client possono connettersi a quella porta.
Ora, in vb, l'unico modo per restare in ascolto sempre sulla stessa
porta e accettare piů connessioni era (per me) quello di lasciare un
winsock in ascolto su una data porta, e rigirare ad altri winsock
l'accept passandogli il requestID. E questo comportava la connessione
del client ad una porta diversa da quella "nota".
Ma questo solo perchč non conosco un modo diverso di operare...
-- 
Quando noi ignoranti eravamo di piů, tutto era piů bello...


Comunque penso di aver detto una fesseria riguardo il metodo da me 
utilizzato e suggerito: lasciando un winsock in ascolto su una certa 
porta (es. 1234) e rigirando la connectionrequest ad altri winsock 
(passandogli la RequestID), il client effettivamente si connette alla 
porta di ascolto del primo winsock.
Quindi alla fine funziona :)
-- 
Quando noi ignoranti eravamo di piů, tutto era piů bello...
(A. Celentano)
Per rispondermi in privato, prima togli l'immondizia dalla testa.

 Quindi alla fine funziona :)
Infatti... non c'è bisogno di rispondere con la prima porta libera.... se tu 
accetti n connessioni per n winsock sulla porta p, puoi lasciare il primo 
winsock attivo in listen su p e gli altri n connected sempre su p, ci pensa 
il tcp/ip a smistare le chiamate.... 

 il tcp/ip a smistare le chiamate.... 
Il fatto è che io "non accetto n connessioni per n winsock sulla porta 
p". Semplicemente lascio gli n winsock chiusi (a dire la verità non 
esistono nemmeno... li carico in runtime e li scarico quando 
perdono/chiudono la connessione) e quando ricevo una request dico loro 
semplicemente di accettarla. Penso che abbiano localport=0 e che il 
tutto sia gestito da VB e dal sistema operativo.
Tra un po' mi toccherà rimboccarmi le maniche e rivedere tutto 
l'argomento in C perchè a casa non posso usare VB e quindi devi darmi 
alla programmazione *nix, quindi niente comodità alla Winsock :) E lì 
voglio proprio vedere come fare con le connessioni multiple (andrò di 
fork()?)
-- 
Quando noi ignoranti eravamo di più, tutto era più bello...


Darkbyte [Work] wrote:
....
Dark fai un piccolissimo errore di fondo
a cui avevo risposto qualche thread fa!
http://telemat.die.unifi.it/book/1997/winsock_prg/wsk_doc1.html
Quando stabilisci un collegamento fra 2 winsock essi vengono identificati
dal pc in maniera univoca
se ho il
winsock(1) collegato a 1.1.1.2
winsock(2) collegato a 123.42.51.23
winsock(3) collegato a 200.173.12.32
il mio pc "server" li marchia
(come non me ne frega non son affari miei di programmatore ad alto livello)
in maniera univoca!
Inviando dati con
winsock(2) riceverà i dati solo 123.42.51.23 e così via!
E' molto agevole e pratico per me programmatore VB
...la discriminante per me è l'indice dell'array di controlli....
sul sito comune c'era un esempio addirittura di mini webserver
dopotutto non è che un array di winsock in ascolto sulla porta 80!!!

 dopotutto non č che un array di winsock in ascolto sulla porta 80!!!
Il limite č nella capacitŕ del controllo winsock di accettare
connessioni...c'č un limite che non ricordo
(non ti accetta connessioni infinite)!
Non so se il limite c'č ancora interfacciandosi direttamente alla api (o
meglio non so se il limite diventa solo la ram)!
Credo di no altrimenti non so come farebbero a vendere windows server
lasciando immutate le dll del winsock!

Scusa ma il mio errore di fondo quale sarebbe? Quello di utilizzare un 
array di winsock?
-- 
Quando noi ignoranti eravamo di piů, tutto era piů bello...


 array di winsock?
rileggiti
....
Infatti. Sul server c'č una applicazione che resta in ascolto sulla 80.
E piů client possono connettersi a quella porta.
Ora, in vb, l'unico modo per restare in ascolto sempre sulla stessa
porta e accettare piů connessioni era (per me) quello di lasciare un
winsock in ascolto su una data porta, e rigirare ad altri winsock
l'accept passandogli il requestID. E questo comportava la connessione
del client ad una porta diversa da quella "nota".
Ma questo solo perchč non conosco un modo diverso di operare...
.....

 Ma questo solo perchč non conosco un modo diverso di operare...
E poi ho scoperto che la porta utilizzata dagli altri winsock era la 
stessa del winsock in ascolto.
Ora il problema (il limite) di cui parli qual'č? Quello dell'array di 
winsock? Il fatto che non si possano tenere in memoria piů di X winsock 
connessi?


 Ma questo solo perchč non conosco un modo diverso di operare...
Bastava che caricassi un altro oggetto WinSock (tramite il metodo Load) 
e lo mettessi in ascolto di quella porta.
-- 
Ciao,
	Fabrizio
===  
http://www.negusweb.it
  ===

 e lo mettessi in ascolto di quella porta.
Ma sbaglio o non si può richiamare il metodo Listen su una porta già
utilizzata?
Oddio potrei anche sbagliare, dato che non uso più VB per queste cose da
un sacco di tempo...
-- 
Quando noi ignoranti eravamo di più, tutto era più bello...
