Newsgroup: it.comp.lang.visual-basic
Titolo: winsock e modulo di classe (vi prego aiutatemi!)

Salve a tutti,
spero proprio che qualcuno mi dia qualche dritta.
Ho bisogno di lanciare piu' connessioni verso il mio server attraverso
un oggetto winsock ma non ci riesco.
Ho provato a creare una formWS dove e' semplicemente inserito l'oggetto
winsock ed un altra formText dove c'e' una textbox dove scrivo la
comunicazione tra client e server. Ho poi creato una classe con tutto
il codice per gestire la comunicazione del winsock.
Dal frmPrincipale ho diversi bottoni che lanciano comandi diversi. Ogni
bottone ha un codice come questo, cambia solo il suffisso del frmText e
del ws:
    Dim frmText-1 As frmTEXT
    Dim ws-1 As clsWinsock
    Set frmText-1 = New frmTEXT
    Load frmText-1
    contalanci=contalanci+1
    frmText-1.Caption = "Lancio comando numero " &  contaLanci
    frmText-1.Show
    Set ws-1 = New clsWinsock
    ws-1.pCheBtn = ComandoUno
    ws-1.pPrefissoFile = "Comando-" & contaLanci
    ws-1.pCheForm = frmText-1
    ws-1.LanciaComando
    Unload frmText-1
    Set frmText-1 = Nothing
    Set ws-1 = Nothing
    Exit Sub
Se lancio un comando per volta tutto funziona correttamente, se lancio
un secondo comando invece un disastro, anziche' vedere il secondo
winsock come un oggetto nuovo sembra utilizzare il primo infatti
risulta gia' connesso e quindi mi da' errore se tento una nuova
connessione.
In teoria la classe non dovrebbe creare ogni volta una nuova istanza
dell'oggetto e comportarsi come se fossero oggetti separati e quindi
codice "duplicato" per ogni istanza?
Dove sbaglio? L'errore e' nel metodo o nel codice"
Vi prego perdete un po' di tempo per me ho proprio bisogno di aiuto!!
Grazie a tutti

 Salve a tutti,
al di la del fatto della classe (che potrebbe forse servirti in una logica
oop?)
se vuoi gestire più winsock basta fare anche un semplice array di oggetti!!!
anzi è il classico help della guida
te lo cito pari pari dall'help di vb6
".......
Accettazione di più richieste di connessione
Il semplice server illustrato in precedenza è in grado di accettare un'unica
richiesta di connessione. È tuttavia possibile accettare varie richieste di
connessione utilizzando lo stesso controllo, creando una matrice di
controlli. In questo caso non sarà necessario chiudere la connessione, ma
sarà sufficiente creare una nuova istanza del controllo, impostandone la
proprietà Index, e richiamare il metodo Accept per la nuova istanza.
Nel codice riportato di seguito si presuppone che sia stato inserito in un
form un controllo WinSock denominato sckServer e che la proprietà Index di
tale controllo sia impostata su 0. In questo modo il controllo farà parte di
una matrice di controlli. Nella sezione Dichiarazioni viene dichiarata una
variabile intMax a livello di modulo. Nell'evento Load del form, intMax è
impostata su 0 e la proprietà LocalPort del primo controllo della matrice è
impostata su 1001. Viene quindi richiamato il metodo Listen per il
controllo, che viene pertanto messo in "ascolto". All'arrivo di ciascuna
richiesta di connessione, il codice verifica se la proprietà Index è uguale
a 0 (il valore del controllo in "ascolto"). In caso affermativo, il
controllo in "ascolto" incrementa il valore di intMax e utilizza tale numero
per creare una nuova istanza del controllo. La nuova istanza verrà quindi
utilizzata per accettare la richiesta di connessione.
Private intMax As Long
Private Sub Form_Load()
   intMax = 0
   sckServer(0).LocalPort = 1001
   sckServer(0).Listen
End Sub
Private Sub sckServer_ConnectionRequest _
(Index As Integer, ByVal requestID As Long)
   If Index = 0 Then
      intMax = intMax + 1
      Load sckServer(intMax)
      sckServer(intMax).LocalPort = 0
      sckServer(intMax).Accept requestID
      Load txtData(intMax)
   End If
End Sub
.....
"
non  mi sembra difficile....
con le classi se non stai attenta/o (sei uomo o donna?) ti ritrovi nei
casini....
e dovresti comunque gestire una clocction di classi winsock per accettare
più connessioni!
...ossia non sposteresti di un mm il problema...

Son sempre mi,
aggiungo ulterioriri chiarimenti.
Nella classe clsWinsock ho dichiarato
Private WithEvents Winsock1 As Winsock
e nella funzione LanciaComando ho i vari comandi
winsock1.port=23
winsock1.connect
winsock1.senddata
ecc...
Ho pensato che magari la funzione non sapesse a che winsock far
riferimento ed ho provato a passare come parametro l'oggetto winsock ma
sembra non funzionare nel senso che se dichiaro:
private sub lanciaComando(cheWS as winsock)
e dal bottone scrivo ws-1.lanciacomando ws-1
chiaramente mi da' errore ed in effetti e' un obrobrio, il fatto e' che
non ho mai lavorato con i moduli di classe e non so come risolvere il
problema.
sigh sigh

 Salve a tutti,
e cmq
leggendo il tuo post non capisco quello che vuoi fare...
ti fai un tuo p2p?
Un tasto invia il comando "DIR"?
Sequenza possibile
...avvio un winsock...mi connetto....invio...stacco
Un tasto invia il comando "PLAY"?
Sequenza possibile
...avvio un winsock...mi connetto....invio...stacco
perchč avviare 2 connessioni diverse???
e poi...occhio che la differenza č anche far TCP ed UDP
con il TCP sei sicura dell'invio e ricezione perchč sei sempre attiva/o
con UDP no...invii e speri che riceva....
Inoltre....il medesimo IP se č connesso su una porta ...come fa a essere
connesso un altra volta? (nel caso tcp)
Ossia ...SE non ti stacchi...non ti riattacchi!
Credo che tu debba un attimo pianificare meglio la sequenza che desideri
Un esempio TCP
nel form generale o nella sub main  istanzio un oggetto winsock ...settando
tutto..compresa la porta del server
NON MI COLLEGO
Comando ..esempio un command_click
Controllo winsock collegato?
SE NO....mi collego
Se si...invio il comando al server
Mi stacco dal server (le connessioni in una rete costano)
Esempio UDP (piů veloce...impegan meno la rete)
Controllo winsock collegato?
SE NO....mi collego
Se si...invio il comando al server
OPZIONALE
Aspetto per un certo tempo che il server mi invii conferma su un altro
winsock...su un altra porta (in pratica sono io ora il server)
Mi stacco dal server (le connessioni in una rete costano)
penso cosě sia piů chiaro no?

 Son sempre mi,
Butta via la classe ed usa oggetto winsock...te lo ripeto....

Ciao,
sono donna, questo implica qualcosa? ;-p
Inanzitutto grazie, ammetto di averci pensato alla matrice di controlli
ma pensavo che bisognasse sbattersi molto di piu' e quindi ho cercato
una via che in quel momento mi sembrava piu' veloce!
Ora mi metto al lavoro e ci provo...
buon lavoro

 Salve a tutti,
e cmq se sei cosi masochista da usare le classi senza saperle usare
un conto è usare
dim server as Cl_winsock
e un altro
dim server as new Cl_winsock
esiste una differenza abissale....ma se non la sai...usa gli oggetti che ti
segnalano meglio il problema!!!
MA PERCHE' usate quello che non sapete usare????
delle volte siete sconsolanti!


si parecchio!
le "o" diventano "a"....per dirne una!

OT.
questa l'hai scritta dopo aver risposto al post-flame??
Scusa, non sto prendendo in giro, ma mi fa sorridere l'idea di uno che
prima si incavola nero per le domande di uno che non capisce..... (ehm
siamo in un post di signora, non posso dire cosa!) e poi
ancora arrabbiato (ti vedo con il fumo nero che esce dalle
orecchie....)
risponde ad un altro!
...oh, sia chiaro, ti vedo perche' mi capita.... :=)

Wodka40
se uno usasse solo quello che sa gia' usare non inizierebbe mail.
Normalmente quando si vuole imparare qualcosa l'unico modo e' iniziare
a documentarsi, man mano provare scrivere del codice e testarlo.
D'altronde sbagliando si impara.
Mi spiace che tu sia incavolato nero come dice Silk, ma ti ringrazio
comunque perche' malgrado la mia ignoranza tenti di darmi una mano.
Hai comunque aperto una questione importantissima su cui non avevo
riflettutto, perche' mi sono concentrata solo sul codice, ed e' la
disponibilita' di porte.
In effetti ho semplificato troppo la questione. In realta' non sono un
server ma un client e mi collego ad un server che mi permette a sua
volta di connettermi ad n macchine in emulazione telnet e queste mi
devono rispondere determinati dati che poi dovro' analizzare. Il fatto
e' che i dati sono diversi a seconda dei comandi lanciati. Ho la
necessita' di lanciare i comandi di notte ed in teoria non dovrei
attendere che un tipo comando termini di recuperare i dati dalle n
macchine (da cui ogni volta mi collego e mi scollego) per lanciare il
secondo ma dovrei poter lanciare il secondo malgrado il primo sia
ancora in elaborazione.
Ora ti faccio un altra domanda idiota, se lascio aperta la connessione
sulla porta 23 e creo una matrice di controlli come si comporta ogni
nuova istanza del controllo? 
:-)


Beh insomma ora qualsiasi cosa dico....
dico che usare le classi senza sapere una mazza di quello che fanno non è
sperimentare....
ma è cercare una pezza a giro su internet perchè casomai devo fare una cosa
in fretta!
Prendo un testo...o un pdf...o un chm....lo leggo e sperimento
le domande allora non saranno MAI stupide...ma al limite ingenue
La signorina dichiara
"....
chiaramente mi da' errore ed in effetti e' un obrobrio, il fatto e' che
non ho mai lavorato con i moduli di classe e non so come risolvere il
problema...."
Allora la domanda sorge spontanea....
ma se non sai cosa è una classe perchè la usi?
e se la vuoi usare perchè invece di copiaincollare alla ".azdecan" non parti
dal principio???
e cmq una classe winsock viene fatta per altri motivi...ossia per espandere
il controllo winsock...
ad esempio per usare la modalità raw...
ossia...è partita proprio da un uso "improprio" delle classi!
Io non mi arrabbio....ma che me frega del problema della signorina....
Cerco di fare capire alla signorina che prima di cimentarsi in cose
astruse...le conviene assimilare...le cose "complicate"
Anche perchè se leggi la risposta sotto....
vedi che la signorina ha idee alquanto confuse su come funziona una rete e
su come funziona un winsock
Cose che (per una volta) son spiegate bene con dovizia di esempi alla
semplice pressione del tasto F1
Ma che me frega del problema della signorina o del "tipo" del postFlame....
Ho una nuova politica di risposte da ora in avanti....
non fornisco solo codice ma cerco anche di "insegnarti  a pescare"
e se non lo accetti...giù bacchettata sulle dita!
Se ti sta bene è così...se non ti sta bene...
oh beh
c'è la black list....mettimi li!
Ciao bello!
:-)
WodkaZen


sigh!
senza speranza!
proviamo a ripetere...
se schacci f1 e cerchi winsock viene fuori la guida con gli esempi....
ora facciamo una ipotesi.....
IL TUO PC chiamiamolo A
IL SERVER REMOTO chiamiamolo B
A si connette a B tramite protocollo TCP sulla porta che vuoi
perchè vuoi fare istanze multiple???
SEI SEMPRE E SOLTANTO CONNESSA a B!!!!
SE poi B a sua volta si connette a 100 altri client son cavoli(cazzi) di B
TU VEDI SEMPRE E COMUNQUE B
ossia tu continui comunque a comunicare con B
io non so come questo server B comunica con i suoi client...questo lo sai tu
cosa devi fare tu?
devi chiedere a B i dati di un suo (non TUO ma SUO) client
il comando non lo so...lo sai tu....
la risposta di B va memorizzata in un supporto idoneo...
ad esempio in un file LogClient.txt
dove scriverai...DATA...ORA...ClientInvocatodaB...RispostaOttenutadaB
tutti dati che sai...!
Ora se metti tutto in un ciclo...per quanti clienti remoti di B vuoi
chiedere info....
è tutto fatto!
alla fine ti stacchi da B!
Se poi metti l'invocazione della procedura in un timer...puoi interrogare il
server B...ogni quanto vuoi...ogni 3 minuti...ogni ora.....ogni 2 ore
NON HAI BISOGNO lo ripeto di multi winsock
La connessione è soltanto da A a B e viceversa!!!
e basta un winsock!

 SE poi B a sua volta si connette a 100 altri client son cavoli(cazzi)
cerco di interpretare una tua obiezione
se chiami 20 volte il server remoto con 20 richieste su client diversi...non
fai prima..!!!
a meno che il server non sia fatto parecchio bene!
Il server remoto ti vede sempre come un unico indirizzo ip
sarà il server remoto ad accettare caso mai più richieste ma poi dovrà
risponderti discriminandole!
nel senso che tu puoi inviarli
una serie di stringhe
INFO CLI01
INFO CLI02
INFO CLI033
INFO CLI0123
ma quando il server comincerà a sparare le risposte...dovrà
suddividerle...altrimenti non sai a quale richiesta risponde!
e se non lo fa...cosa che presumo sia...
devi inviare una richiesta volta per volta ed aspettare che completi la
risposta prrima di inviarne un altra!

oh, fermo fermo.... giurin giuretto che non stavo criticando :0)
Solo che mi e' passata per la testa una vignetta e mi ha fatto
sorridere! Tutto qua.
La tua risposta non mi e' parsa neanche particolarmente cattiva...
sostengo la filosofia
dell' "impara a pescare", invece di "prendi il pesce gia' pronto" (con
le debite
misure). Le risposte che hai dato a me, mi sono sempre state bene (e
ringrazio
ancora).
L'unica cosa, come ti ha fatto notare chris, e' che se uno non
sperimenta... se non usa
quello che non sa usare... di fatto, non impara. Al limite si fa l'idea
(importantissima)
teorica e basta.
Passando invece alla sua di lei medesima domanda finale.. (apro la 23,
la lascio
aperta e...) posso dire che non l'ho capita?
Soprattuto nel fatto che se tu sei un client, non capisco perche' tu
debba aprire
mille winsock. Sono comandi che possono verificarsi in contemporanea?
cioe' tipo
dire al server "metti in moto la macchina uno", e poi "fai suonare la
sirena" in
contemporanea? Perche' a me, da quanto hai scritto, sembrerebbe che in
realta' i tuoi
problemi siano tutti del server e che ti basti una sola connessione....

Ciao Silk,
il problema e' che non so a priori quali comandi verranno lanciati e su
quali macchine
Il sistema e' questo: mi collego al server, che mi collega alla
macchina A a cui chiedo il risultato X, mi disconnetto dalla macchina
A, mi collego alla macchina B e chiedo il risultato X e via dicendo.
Nello stesso tempo vorrei poter gestire una nuova "connessione" in cui
sempre collegata allo stesso server (e quindi mi potrebbe star bene
anche un winsock) mi collego alla macchina (stavolta) B e chiedo il
risultato Y, mi disconnetto dalla macchina B e mi collego alla macchina
C e chiedo il risultato Y e via dicendo.
E' chiaro che sulla stessa connessione se sapessi che nello stesso
momento sulla stessa macchina devo richiedere il risultato X e Y mi
basterebbe una sola connessione mi collego ad A chiedo x, chiedo y, mi
scollego ecc...
Il fatto e' che magari con il comando X sono gia' alla macchina H e con
il comando Y sto iniziano ora sulla macchina B quindi devo utilizzare
due "connessioni" diverse che mi lascino da una parte collegata ad H ad
aspettare le risposte del comando Y per poi disconnettermi e
ricollegarmi alla macchina successiva per lo stesso comando, dall'altra
collegarmi a B (senza disconnettermi da H) e richiedere Y e poi
continuare con questa richiesta su altre macchine.....
Non so se sono stata chiara....
Ho messo tra virgolette "connessione" perche' se non ho capito male
posso avere una sola connessione aperta e poi creare n winsock in una
matrice di controlli e per ogni n-esimo winsock gestire
l'interrogazione che mi interessa. Giusto?
Certa di aver palesato nuovamente la mia ignoranza, vi saluto :-*

 A, mi collego alla macchina B e chiedo il risultato X e via dicendo.
sigh non ci capiamo....
è paradossale...non ci capiamo!!!
e quindi potremo paralre per infiniti giorni!
A tuo pc es. IP 192.168.1.10
B server es.IP 192.168.1.33
C altro computer es.IP 152.48.132.25
A si collega a B sulla porta 23 OK!
Tu chiedi qualcosa a B
B che cosa fa?
Interpreta il tuo messaggio....
da quel che ho capito....
B si connette a C
B chiede qualcosa a C
C trasmette qualcosa a B
B lo impacchetta e spedisce ad A
Tu di che cosa hai bisogno? di un winsock!
1!!!
Tu non VEDI C che risiede addirittura su una rete esterna!
A non vede C
A può vedere C solo in un caso....se usi un p2p tipo emule/edonkey con un
server centrale
ed allora la cosa diventa simile a questa
A si connette a B
A chiede a B l'indirizzo di C
C comunica a B il suo IP
B lo comunica ad A
A si connette a C sul suo ip
QUI ti serve un nuovo winsock per ogni IP
Un errore che mi sembra stai facendo....
SE usi la medima porta ed il medesimo IP
UN PC.....UN WINSOCK
UN pc tanti winsock(array di winsock) ...è per accettare connessioni
multiple
MA NON DAL SOLITO PC SULLA SOLITA PORTA
ma da altri pc
Esempio tipico...una chat!
....ogni utente è un pc!
Tanti winsock per tanti utenti attivi nel canale!
Tu se ti connetti al server sulla porta 23.....userai solo quella e quell'ip
se non conosci niente altro di C (ossia il suo indirizzo ip)
devi utilizzare un solo winsock
A meno che tu non ti spighi male..ed hai un range di ip corrispondenti a
vari pc da interrogare ciclicamente.....
Ma tu lo sai...hai chiaro.... quello che devi fare?
Non mi sembra mica tanto!

 Non mi sembra mica tanto!
ossia spiegaci il caso concreto....
cosa devi fare?
...farti inviare rendiconti da vari pc di una rete?
Ti devono inviare i totali degli incassi della giornata?
Farti inviare dei log da macchine linux?
farti inviare ricevute di pagamento?
che caso concreto č????
Perchč entri telnet?...dove ? su un as400?

 l'interrogazione che mi interessa. Giusto?
NO!
in termini volgari
Connessione=Winsock
la connessione la fai con l'oggetto winsock
Tramite winsock connette una porta di un IP alla porta di un altro IP
es.
www.martek.it
connette sulla porta 80 l'ip del tuo pc all'ip corrispondente a
www.martek.it
se già sei connessa....non ne apri un altra!!!
il server in ascolto sulla porta 80 "serve" più IP perchè apre connessioni
su diversi IP...non sul medesimo!
un solo filo collega 2 punti

Si ho capito quello che dici. Una porta + un Ip = un winsock
Il mio caso concreto e' una connessione ad un Ip sulla porta 23 con
autenticazione, da qui lancio rlogin per connettermi ad un altro server
con autenticazione che lancia automaticamente un programma che in
emulazione vt100 mi permette di comunicare con delle macchine e
ricevere da queste dei dati, una sbrodolata di informazioni in formato
testo con un determinato tracciato.
Quello che vorrei fare io e' una simulazione di quello che fa il
programma SmarTerm che mi permette di lanciare il programma piu' volte
(il che mi apre piu' tab) e mi permette di gestire due connessioni
separatamente.
Ti e' piu' chiaro ora quello che voglio fare? E' fattibile?
Grazie e scusa per il disturbo


Oh finalmente ci siamo!
NO!
tramite il giro che vuoi no!...ossia su quel server ci vai con la tua
connessione....
che poi il programma che gira sul server faccia 1000 connessioni...a te non
importa!
Tu sei sempre collegata sulla porta 23...e se già sei collegata...non puoi
aprire altre connessioni da quell'IP!
Puoi tentare di collegarti invece tu e non il server a tutte le macchine
che macchine sono?
PC o proprio macchine di produzione? (presse,stampanti rotative etc etc)
se sono pc è abbastanza agevole basta sapere il loro ip
Smartterm si connette a più pc proprio perchè apre tanti winsock per quante
macchine sono....ci vuol poco a rifarlo in vb
Caso mai devi avere un attimo di attenzione nel codificare l'invio come
terminale stupido vt100
un po di risorse
http://www.vbsimple.net/index.htm?/cliserv/clser_00.htm
http://www.vbsimple.net/index.htm?/cliserv/clser_02.htm
http://www.vbcity.com/forums/faq.asp?fid=10&cat=Winsock&#TID21664
 (molto
completo)

scusa, io non conosco smartterm, e spero di non dire cavolate a livello
di programmazione.
pero', in teoria, non manca un passaggio nel tuo discorso? ossia che la
porta in uscita cambia.
Quindi io posso fare delle connessioni multiple ad un server da un mio
programma client, perche'
il programma server non risponde solo all'ip, ma a ip + porta.
Ho provato a fare la seguente prova:
A, server sul mio pc, in ascolto sulla 1234
B = programmino client.
In questo programmino ho  messo si un unico winsock, ma in array... sul
form, ho messo quello con index = 0
poi ho aggiunto 3 bottoni, che mi servono per simulare tre richieste da
fare al server, slegate tra di loro.
Sul form load:
Private Sub Form_Load()
on error goto errore
 Dim intClient as integer
  for intclients = 1 to 2
     load winsock1(intclients)
     winsock1(intclients).connect "localhost", 1234
   next intclients
   winsock1(0).connet "localhost", 1234
errore:
   if err.number <> 0 then debug.print err.number & err.description
end sub
per caricare l'array di winsock di altri due elementi, tanto da averne
uno per bottone.
Per il wiinsock1 ho aggiunto
Private Sub Winsock1_Close(Index as integer)
  lstmsg.additem "socket chiuso per client " & index
  Winsock1(index).close
 end sub
 Private Sub WinsocK1_DataArrival(Index as integer, byval bytesTotal as
long)
     dim strData as string
     Winsock1(Index).getData strdata
     lstmsg.additem "Riceive client: " & Idnex & " - " &  strdata
  end sub
  Sul click dei bottoni ho richiamato sempre la stessa funzione:
  Private Sub SendMessage(BYval strClient as string, BYval
intSocketIndex as integer, Byval strMessage as string)
    winsock1(intSocketIndex).senddata "Invio Client " & strClient & ":
" & strMessage
    DoEvents
    lstmsg.additem "send " & strMessage
  end sub
  Private Sub Command1_Click()
     sendmessage "pluto", 0, "quadri"
  end sub
  Private Sub Command2_Click()
     sendmessage "pippo", 1, "fiore"
  end sub
  Private Sub Command3_Click()
     sendmessage "paperino", 2, "sasso"
  end sub
In pratica, ogni bottone usa un suo socket dell'array. Ed il server
risponde esatamente a quello.
Ora, chiedo scusa delle lunghezza del post, e fermo restando che il
componente winsock e' sempre e solo uno......
In teoria questo non fa quello che Chris chiede? Cioe' un unico client
che si connette piu' volte ad un unico server
in "contemporanea" (aehm, passamela, dai!!)

Silk e' proprio quello che voglio fare!
Quindi, se non ho capito male la remote Port rimane la stessa mentre
dovrebbe cambiare la localport giusto?
Pero' non vedo dove tu la imposti la porta in uscita; se ne occupa da
solo l'array di winsock a trovare una disponibile?
Grazie comunque, ora mi butto a fare le prove e a leggere comunque la
doc. indicata da Vodka!!

si, la porta locale cosi' com'e' la prende in automatico...
pero' se non ricordo male, winsock ha anche la proprieta' localport.
ma ti importa??
cmq, se poi fai un netstat puoi controllare...

ps. cmq, volevo solo aggiungere che wodka ha ragione dicendo che prima
bisogna "capire" il problema :0)

No non mi importa specificare la localport mi basta che prenda la prima
libera.
Non ho mai detto che Vodka ha torto, ho forse sottolienato che e' un
filo prevenuto e a volte un po' brutale ma la cosa piu' importante e'
che e' disponibile, e ammetto che a volte ci sono domande davvero
banali che si trovano nell'help magari semplicemente cercando tra le
proprieta' di un oggetto, ma capita anche che a volte sei talmente
"ubriacato" dallo stress che ci si puo' perdere in un bicchier d'acqua.
Forse a voi non e' mai successo, ma a me si...
Comunque non sono una che non si documenta ma quando sei messo sotto
pressione la cosa piu' importante e' arrivare in fretta alla soluzione,
una volta trovata ti puoi permettere di trovare il tempo per
documentarti, fortunatamente non sono sempre sottopressione!
Grazie ancora di cuore ad entrambi..

 la porta in uscita cambia.
forse non ci siamo capiti....
mio messaggio delle 16.12
"...
Tramite winsock connette una porta di un IP alla porta di un altro IP
...
"
un pc esiste come indirizzo IP e come porte su cui risponde qualcosa
lista a 
http://www.iana.org/assignments/port-numbers
ORA
il winsock la segna logicamente la porta  non fisicamente...fisicamente
credo fra te e me sia pacifico...che corrisponde un solo IP a quella
porta!un medesimo ip non apre 2 volte la solita porta se non la chiude
prima!...o meglio...accidenti a non avere i termini sulla punta della
lingua....
client 1.1.1.1 porta 1234 connette 10.1.0.10.10 porta 1234
un altra istanza non avviene in maniera uguale ma ad esempio
client 1.1.1.1 porta 1235 connette 10.10.10.10 porta 1234
è spiegato bene qui
http://telemat.die.unifi.it/book/1997/winsock_prg/wsk_doc1.html
"...
Una socket è una parte di codice che può sia trasmettere che ricevere dati
su un network TCP-IP. Una socket è univocamente determinata da cinque
parametri:
Indirizzo IP del client
Porta del client
Indirizzo IP del server
Porta del server
Protocollo utilizzato (TCP o UDP)
In pratica una socket identifica una specifica connessione tra un client ed
un server su una determinata porta. Le porte qui nominate non sono vere e
proprie porte fisiche, ma porte logiche, cioè identificativi numerici con i
quali il TCP-IP è in grado di stabilire più connessioni contemporanee sulla
stessa macchina.
..."
resta da vedere una cosa e qui è la mia perplessità
un sistema di autenticazione come mi sembra sia questo rlogin (Linux?)
se ti connetti 40 volte (con 40 porte diverse sil client) ti fa passare come
40 utenti?
per questo IMHO...fa prima ad interfacciarsi alle singole macchine...io non
credo che una autenticazione al solito ip conceda più istanze autenticate!
... tanto più che come forse ho capito...si autentica ad un coso...che a sua
volta si autentica presso altre macchine.....BOH!
tanto per scaldare i motori
tu hai dato il client
io do il server :-P (rozzissimo...ma didattico...andrebbe scritto un parser
decente e tanto altro..cmq serve allo scopo!)
un form...un winsock...un command...un listbox
Option Explicit
Dim IntMax As Long
Dim genMsg As String
Dim sServerMsg As String
Dim sItemData As String
Dim Buffer As String
Private Sub Command1_Click()
List1.Clear
End Sub
Private Sub Form_Load()
   IntMax = 0
   sckServer(0).LocalPort = 1234
   sckServer(0).Listen
   Buffer = ""
End Sub
Private Sub sckServer_ConnectionRequest(Index As Integer, ByVal requestID As
Long)
   If Index = 0 Then
      IntMax = IntMax + 1
      Load sckServer(IntMax)
      sckServer(IntMax).LocalPort = 1234
      sckServer(IntMax).Accept requestID
      Me.Label1.Caption = "Utenti connessi: " & CStr(IntMax)
      genMsg = "Utente connesso. Informazioni:"
      List1.AddItem genMsg
      genMsg = " IP(" & Me.sckServer(IntMax).RemoteHostIP & " Porta client
aperta: " & Me.sckServer(IntMax).RemotePort & ")"
      genMsg = genMsg & " Nome: " & Me.sckServer(IntMax).RemoteHost
      List1.AddItem genMsg
      sckServer(IntMax).SendData "HELO " & Me.sckServer(IntMax).RemoteHost &
"(" & Me.sckServer(IntMax).RemoteHostIP & ")" & vbCr
   End If
End Sub
Private Sub sckServer_DataArrival(Index As Integer, ByVal bytesTotal As
Long)
    Dim hdrtype
    sckServer(Index).GetData sItemData, vbString
    Debug.Print Len(sItemData), sItemData & " .. " & Asc(sItemData)
    If Asc(sItemData) = 13 Or Asc(Right(Trim(sItemData), 1)) = 13 Then
        If Len(sItemData) > 1 Then
            Buffer = Buffer & Left(sItemData, Len(sItemData) - 1)
        End If
        List1.AddItem "(" & sckServer(Index).RemoteHostIP & ") " & Buffer
        Debug.Print Buffer
        Buffer = ""
        sckServer(Index).SendData "MSGRCV OK THANKS!" & vbCr
    Else
        Buffer = Buffer & sItemData
    End If
End Sub
Interrogalo con hyperterminal ad esempio...
(metti l'echo...l'emulazione che vuoi...solo in trasmissione disabilita
l'avanzamento riga sul ritorno a capo..ma funziona anche con quello...e per
non stare a scrivere un parser!...c'ho da fà!)
oppure ancora meglio....interrogalo con il tuo client...io l'ho fatto!
io noto qualcosa!.....
comunque nel tuo client ho fatto 2 modifiche
nel formload
aggiungi sotto il load winsock
....
    'PROVA UN PO a levare il commento!
     'Winsock1(intclients).LocalPort = 1234
....
e poi siccome il mio server reagisce al ritorno a capo per separare le
stringhe
modifica dentro  Private Sub SendMessage
in
 Winsock1(intSocketIndex).SendData "Invio Client " & strClient & ":" &
strMessage & vbCr
.....
nota le porte locali
Salutos

ot... dopo provo quello che hai scritto... anche perche' a "teoria" non
capisco
quello che mi stai dicendo sul "forzare" tutte le porte del client alla
1234.
Vorrei solo fosse chiaro che non sto cercando di creare nuovi flames..
o
giocare a chi e' piu' bravo... Anzi, guarda, lo metto bene per
iscritto: non mi
ritengo il dio della programmazione, ne la persona piu' intelligente
del mondo,
quindi apprezzo chi mi spiega.
Se ho detto cose stupide, ti ringrazio per le correzioni!

 alla 1234.
stiamo solo ragionando...non ti preoccupare....
non sarà IL POST dell'anno come qualità tecnica...
ma sicuramente molto meglio di tanti che ci sono ultimamente!
Saluti