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

Salve a tutti!!
Sono ancora io con il controllo WinSock heheheheh , sto diventando un
esperto!
Allora vi espongo il mio nuovo problema!
Devo effetuare le mie solite commessioni tra più clients a d un server in
modo tale da trasferire contemporaneamente dati dal server ai clientes.
Ho creato un programma server che gestisce un vettore dinamico di controlli
WinSock che si incrementa ad ogni nuova connessione di un diverso client!
Per far si che venga stabilita la connessione il programma server assegna ad
ogni connessione una diversa porta in un range di porte stabilito a priori.
Qui nasce il problema!
Infatti l'amministratore del provider che dovrà ospitare il mio programma
Server dice che non potrà mettermi a disposizione un numero elevato di
porte, al massino 3 :(((((!
Come faccio a far si che vengano effettuate piu di tre connessioni clients
contemporanee al programma server con solo tre porte a disposizione?
Quello che ho fatto fino ad ora non serve a nulla?
 :((((((((( :(  (spero di no)!!!!
I programmi IRC per esempio si connettono solo su poche porte come fanno?
Sono anche disposto a buttar via tutto il lavoro fatto fino ad ora
((((   ........... ma come posso risolvere altrimenti il mio problema!!
Vi prego aiutatemi!!! (come al solito :))) ......)
Vi ringrazio anticipatamente

>I programmi IRC per esempio si connettono solo su poche porte come fanno?
Vedi sopra. Tutti i server funzionano in questo modo: POP3, SMTP, Web Server, etc.
Antonio

Ciao,
il problema e' risolvibile creando una matrice di controlli WSCK.
In pratica, ogni qualvolta il server riceve sulla porta una chiamata che
viene accettata, tu carichi un un nuovo controllo (incrementando l'indice
:O) e lo metti in ascolto.
Chiaramente il numero della porta rimane il medesimo per tutti i controlli e
non hai quindi necessita' di avere un range di porte, in quanto le diverse
sessioni di connessione avvengono in maniera (passami il termine)
sequenziale.
Dal mio punto di vista, la scelta di un'unica applicazione che gestisca la
connessione di uno a molti, la dove e' possibile, e', vista la
problematicita' della gestione, da evitare.
Bisogna infatti considerare:
1) la gestione errori e del TimeOut deve essere perfetta, in quanto il
blocco di un collegamento determinerebbe la paralisi del servizio
2) se fra i pacchetti di dati da trasmettere ve ne sono di voluminosi
occorre predisporre un sistema di distribuzione risorse, in quanto e'
illogico che, supponendo di dover inviare un pacchetto della durata di due
minuti per mezzo del primo controllo e pacchetti della durata di quattro
secondi per i successivi controlli, il secondo controllo debba attendere 2'
e 4'' il terzo 2' e 8'' e via andare
3) il controllo winsock non e' particolarmente adatto ad una multigestione
al di fuori dei suoi eventi, diventa cioe' un tormentone nel momento in cui
si vadano a scrivere sub o function che richiamano i suoi metodi in quanto
e' tutto da bufferizzare o che verifichino gli eventi dei controlli
indicizzati.
Io personalmente, avendo dovuto scrivere un programma di posta che gestisse
quella interna al mio ente su intranet e quella esterna su internet, ho
optato, per quella interna, per il sistema di gestione di un range di porte,
ognuna delle quali viene gestita in maniera asincrona da un programma
autonomo.
Il programma client non fa null'altro che fare una scansione delle porte
fino a che non trova il primo server libero a cui connettersi.
Questo sistema ti svincola quanto meno da molte delle problematiche di
timeout e di distribuzione delle risorse.
beppe

Non riesco a risolvere da solo...
Per come ho struturato i due programmi (Server e Client) se tento di forzare
la connessione sulla stessa porta mi va in errore dicendomi :  Indirizzo già
utilizzato!!!
booo!!!......... non capisco!!!
Chi di voi è così buono da accettare via e-mail i miei sorgenti dei due
programmini per vedere come posso risolvere il mio problema?
.........O forse è meglio che posti al news group i miei listati?
vi prego datemi una mano :)))
aspetto vostre notizie!!
Vi ringrazio anticipatamente

Ciao,
a titolo esemplificativo, per la sola connessione, in un form (Server) metti
il controllo W1 (winsock) con .index = 0 e .localport = 2000.
Questo il codice:
Option Explicit
Private Sub Form_Load()
    W1(0).Listen
End Sub
Private Sub W1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    W1(Index).Close
    W1(Index).Accept requestID
    MsgBox "Accettata connessione Winsok indice " & _
    W1(Index).Index & " su richiesta " & _
    requestID & " su porta " & W1(Index).LocalPort
    Load W1(Index + 1)
    W1(Index + 1).Listen
    MsgBox "Attesa connessione Winsok indice " & _
    W1(Index + 1).Index & " su porta " & W1(Index + 1).LocalPort
End Sub
Crei l'eseguibile.
Stessa cosa per il client dove pero' carichi il W1 senza impostare nulla e
un commandbutton, quindi il codice:
Option Explicit
Private Sub Command1_Click()
    W1.Connect "127.0.0.1", 2000
End Sub
L'indirizzo "127.0.0.1" ti permette di provare in locale le connessioni.
Crei l'eseguibile.
A questo punto lanci il server e svariate istanze di client, man mano che
clicchi su un bottone di ciascuna istanza client vedrai che verra' caricato
un nuovo controllo winsock senza nessun conflitto.
Sperando di essere stato chiaro.
beppe

 wrote in
message 8fe3ub$kf1$1...@fe2.cs.interbusiness.it...

ok! :))
perfetto !!!!
Adesso va tutto ok grazie mille!!