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

Scusate ma ho un problemino con una matrice di Winsock.
Sto progettando un gioco in VB6 da fare online con degli amici. Praticamente
nel form_load mi creo una matrice di controlli Winsock, e a tutti assegno
LocalPort=1122 (numero scelto a caso da me).
Ora... ovviamente questo mi dà problemi, perchè la porta risulta occupata
già dal Winsock(0). Come posso fare per risolvere il problema? Dovrei usare
delle porte sequenziali? Oppure evitare di costruire una matrice di Winsock
e gestire tutto con uno solo? ma non credo che si possa, dato che gli utenti
sono molti e ognuno dovrà richiedere una connessione al programma che fa da
server.
Insomma, mi illuminate, pls?

 Insomma, mi illuminate, pls?
se ne' parlato tempo fa , prova a cercare "winsock utenti" e vedi che esce !
Oppure collegati allo 0 sulla porta 1222 e ricevi in risposta la porta
aperta valida , salvi e ti riconnetti al winsock X sulla porta Y tipo ...
Client1
-> connetto a 1000
<- ricevo in risposta "1,1001"
chiudo connessione a 1000
apro connezzione a 1001 su winsock 1
....
Client X
connetto a 1000
ricevo X,100X
disconnetto e connetto a winsock(x) su porta 100X
PS: controlla le liste delle porte e trovane di alcune che non vengono mai
usate o usate di rado , almeno non vai ad utilizzare una porta usata da un
altra app !
PPS: pero' secondo me , ci deve essere un qualcosa per usare un solo winsock
come server :-/
-- 
<Gigio2K>
Sito Comune
Nokia -> I.T.H.N. -> 
http://www.ithn.it/
VB -> I.C.L.VB -> 
http://www.it-lang-vb.net/

 come server :-/
Ecco, appunto...

 Insomma, mi illuminate, pls?
non molto tempo fa ossia esattamente.... aspetta che guardo.....
Venerdi 17 Gennaio ore 12.36
mio post in risposta dell'amico di Wally AKUMA
titolo del post originario
WS error 10061
Vegeta anche tu........una letturina dei post passati....
:-)
La porta è quella ma ci sono istanze diverse del winsock!
cmq il tuo problema è un altro....aspetta a leggere il post passato!
il problema: devi trovare una porta libera...non occupata da un altro
server!
 perchè (anche se non sembra) un netstat -na ti rivela quante porte hai più
o meno attive!!...su quelle c'è già qualcosa che è collegato o ascolta!!!
Ti puoi avvicinare al problema in due modi....
a) Te ne freghi ...scegli porte ALTE dici che il tuo server deve essere ,ad
esempio, il 57412 e son cavoli dell'utente abilitare il firewall su queste
porte, controllare se son libere etc etc...come fa ad esempio Emule o
Edonkey!
b) Fai un po di codice in più....testi le porte per trovare la prima
libera..(ma sarà sul tuo pc.....su quello dei tuoi amici ci puoi contare che
sia la solita??)...e la settate correttamente
nel caso b) sarebbe corretto ed elegante se i due winsock negoziassero la
porta di collegamento...vedi tu....la a) è la soluzione più
adottata!...anche perchè i casini ci son comunque nell'installazione...in un
mondo di Firewall,Proxy ed antivirus!!!!
:-)
Bye man!
--
%%============================%%
Il Wodkino Nazionale è raggiungibile anche a :
www.martek.it
Ed ha pure il forum...
http://www.martek.it/go.asp?PortamiA=1

 Come posso fare per risolvere il problema?
I server basati sui socket TCP normalmente funzionano così:
1) c'è UN socket in listen su una porta nota (es.: 80 per l'http, 21 per
l'ftp ecc.)
2) quando il server rileva una richiesta di connessione, accetta la
richiesta GIRANDOLA AD UN ALTRO SOCKET sulla stessa porta.
In pratica, come è scritto in decine di esempi che si trovano in rete,
Client:
RemotePort=1122, LocalPort=0 (così il SO ne assegna una libera, a meno che
non ti interessi usare una porta prefissata)
Server:
- Un socket in ascolto (wskControl)
- Un array di socket dedicati alle connessioni con i client (wskServer(i))
la localport per tutti è 1234, ma solo wskControl è in listen
Nell'evento ConnectionRequest del socket di controllo devi trovare il modo
di decidere quale dei socket che hai a disposizione è disponibile per la
connessione, o se devi crearne uno nuovo a runtime. Una volta individuato
l'index appropriato, basta dire "wsk(index).Accept RequestId", dove
RequestId e l'identificativo della richiesta pervenuta al socket di
controllo
A questo punto hai di nuovo il socket di servizio in listen e il client ha
il suo bravo canale aperto per comunicare quello che vuole.
--
Ciao, Silv:o)

Grazie a tutti, in effetti dopo aver gironzolato un po' su (mitico) GOOGLE
ho trovato un po' di esempi e ora ho un bel client/server che va a gonfie
vele. Ora però devo costruirci intorno tutto il resto.
Grazie ancora :)
--
Saluti dal Grande VEGETA PRINCIPE DEI SAIYAN