Newsgroup: it.comp.lang.visual-basic
Titolo: -- collegare piu' client ad un'applicazione server

per scopi personali ho creato un applicazione server con il controllo
Winsock, di cui riporto questo esempio di codice
Option Explicit
Private Sub Form_Load()
    Winsock1.Listen
End Sub
Private Sub Winsock1_Close()
    With Winsock1
        .Close
        incrNC -1
        .Listen
    End With
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
    With Winsock1
        .Close
        .Accept requestID
    End With
 
    incrNC 1
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim d$
 
    Winsock1.GetData d
    Winsock1.SendData "Risposta a: " + d
End Sub
Private Sub incrNC(incr%)
    Static nc%
 
    nc = nc + incr
    Caption = "Numero connessioni: " & nc
End Sub
Il problema pero' e' che vorrei, che a questa applicazione, si
potessero collegare piu' applicazioni client (invece che una alla
volta).
Se infatti lancio due volte l'applicazione client, la seconda istanza
di essa non riesce ad accedere al server, perche' logicamente trova la
porta gia' bloccata.
Quando ad esempio ci colleghiamo ad un server POP3 per scaricare la
posta, e' probabile che altri utenti nello stesso istante stiano
facendo la stessa operazione, e' cio' nonostante tutto avviene senza
problemi.
Dove sta il trucco?

 wrote in message
news:9dpige.3...@alex.my.fqdn...


Dove sta il trucco?
Sul server metti un array di winsock, e fai il load per ogni nuova connessione.
Ovviamente, poniti un limite per non caricarne troppi ;-)
hth, hal

 wrote in message
9dpige.3...@alex.my.fqdn...


 wrote in message
og5M6.2418$0V5....@news2.tin.it...



Non sono d'accordo.
Così facendo, se tu avessi 1000 client dovresti utilizzare 1000 porte
tcp/ip.
Non è per questo che devono essere usate le porte.
Semmai è molto meglio caricare un array di Winsock da utilizzare ciascuna
per una connessione con un client diverso, sempre sulla stessa porta.
ciao
ugo

| Non sono d'accordo.
| Così facendo, se tu avessi 1000 client dovresti utilizzare 1000 porte
| tcp/ip.
| Non è per questo che devono essere usate le porte.
| Semmai è molto meglio caricare un array di Winsock da utilizzare ciascuna
| per una connessione con un client diverso, sempre sulla stessa porta.
Ok per l'array di winsock sul server, uno per connessione attiva. Ma non sono d'accordo
sull'usare la medesima porta per tutte le comunicazioni: si potrebbero avere dei
conflitti.
A meno di essere smentito, questa del conflitto dovrebbe essere una eventualità da tenere
in considerazione nell'uso della stessa porta per più connessioni...
Private Function FindOpenWinsock() As Integer
  Dim X As Integer
  For X = 0 To wsArray.UBound
    If wsArray(X).State = sckClosing Then
      wsArray(X).Close
      DoEvents
    End If
    If wsArray(X).State = sckClosed Then ' We found one that's state is "closed", so let's
use it
      UserListUpdate X, wsArray(X).LocalPort, , "", ""
      FindOpenWinsock = X
      Exit Function
    End If
  Next X
  '  OK, none are open so let's make one.
  '  The LocalPort value is that of the first element of the array.
  Load wsArray(wsArray.UBound + 1)
  '  Let's make sure we don't get conflicting local ports
  LocalPorts = LocalPorts + 1
  wsArray(wsArray.UBound).LocalPort = wsArray(wsArray.UBound).LocalPort + LocalPorts
  '  and then let's return it's index value
  FindOpenWinsock = wsArray.UBound
End Function