Newsgroup: it.comp.lang.visual-basic
Titolo: Socks: Connessione multiclient

Mh...Innanzituto un saluto a Ugo Mangini che rivedo con piacere ancora vivo
nonstante i miei assalti insistenti durante il periodo dei miei primi passi
con Vb,
Adesso diciamo che sono un po' piu smaliziato :)
e cmq la mia fissa rimane sempre quella : Programmazione winsock
Cmq ci siamo...riesco adesso a gestire bene tutti gli aspetti di sock..
tranne uno...
Ragazzi sto impazzendo.
Allora il mio problema NON mi sembra molto semplice
L'idea e' di implementare nel mio programma una specie di chat multiutenza
E allora : Un Sock fa da server sul proprio IP alla porta 9380
mentre gli altri sock gli si connettono .
Adesso : (partendo dagli ultimi risultati)
Riesco a tenere connesso un solo sock al sock server
una volta ci sono riuscito con due insieme e poi mai piu'...
La tecnica che mi direte di utilizzare e' sicuramente quella che utilizzo io
..ma so che ci dev'essere qualkosa che non va.
Di seguito tutte le info che posso darvi
e il codice :
[Ch] e' l'oggetto winsock che fa da server, oggetto ovviamente messo in
array
Private Sub ch_ConnectionRequest(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
    Load PrivIrc.ch(ch.UBound + 1)
    ch(ch.UBound).Accept requestID
    ch(0).Close
    ch(0).Listen
End If
End Sub
Private Sub ch_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim strData As String
ch(Index).GetData strData
MsgBox "Input da client numero " & Index & " : " & strData
Ecco tutto.
La procedura esatta e' questa e ne sono sicuro..ma cos'e' che sbaglio?
L'errore con cui esce di solito e' : "Connection is forcefully rejected"
Cosa sbaglio?
Grazie per l'interesse che sono sicuro avrete per questo post.
[Akuma]

...

Forse dico una cavolata, ma credo che i vari oggetti winsock che
fungono da server non possano avere lo stesso numero di porta, e a
tale proposito so che impostando port=0 ne viene assegnata una
casuale, però qui lo dico e qui lo nego...  ;-)
Il Conte

[cut]

Conte, La porta del server ( che e' unico) deve rimanere UNA, i client (piu
di uno) si devono connettere tutti alla stessa porta :)
Insomma ne piu ne meno di come fa un irc server :)


Il tuo codice non lo' provato, percio' non so dove esce con l'errore.
Questo e' il codice "adattato" al tuo scopo (penso).
Per provarlo devi inserire in un form una TextBox MultiLine con nome "Status",
un CommandButton con nome "cmdConnections" e ovviamente WinSock con nome
"Winsock", il Command serve per elencare i socket connessi.
Provalo e fammi sapere.
PS. Con alcuni WinXP non invia i dati a tutti i socket ma solo
    all'ultimo connesso, questo mi è successo (e continua) solo con uno
    su 4 con cui ho provato Bahh!!! misteri di WinXscazz.
<VB Code>
Private Sub Form_Load()
  With Winsock(0)
    .LocalPort = 9380
    .Listen
    Status = "Server Pronto" & vbCrLf
  End With
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim WSock As MSWinsockLib.Winsock
  For Each WSock In Winsock
    If WSock.State <> sckClosed Then WSock.Close
  Next WSock
End Sub
Private Sub cmdConnections_Click()
Dim WSock As MSWinsockLib.Winsock
  Status = Status & "-- Connessioni Attive  ----------------------------------------------" & vbCrLf
  For Each WSock In Winsock
    With WSock
      If .State = sckConnected And .Index > 0 Then
        Status = Status & " (" & .Index & ") " & .RemoteHostIP & ":" & .RemotePort & " " & .RemoteHost & vbCrLf
      End If
    End With
  Next WSock
  Status = Status & "--------------------------------------------------------------------------------" & vbCrLf
  Status.SelStart = Len(Status)
End Sub
Private Sub Winsock_Close(Index As Integer)
  Status = Status & Time & " (" & Index & ") " & Winsock(Index).RemoteHostIP & " Disconnesso" & vbCrLf
  Status = "Socket Aperti " & Winsock.Count & vbCrLf
  Status.SelStart = Len(Status)
  Winsock(Index).Close
  Unload Winsock(Index)
End Sub
Private Sub Winsock_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Dim NewWSck As Integer
  If Index = 0 Then
    NewWSck = Winsock.UBound + 1
    Load Winsock(NewWSck)
    With Winsock(NewWSck)
      .LocalPort = 0
      .Accept requestID
      Status = Status & Time & " (" & intMax & ") " & .RemoteHostIP & " Connesso" & vbCrLf
      Status = "Socket Aperti " & .Count & vbCrLf
      Status.SelStart = Len(Status)
    End With
  End If
End Sub
Private Sub Winsock_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim strData As String
  Winsock(Index).GetData strData
  SendToAll strData
  MsgBox "Input da client numero " & Index & " : " & strData
End Sub
Public Sub SendToAll(prmString As String)
Dim WSock As MSWinsockLib.Winsock
  For Each WSock In Winsock
    With WSock
      If .State = sckConnected And .Index > 0 Then
        .SendData prmString
      End If
    End With
  Next WSock
End Sub
</VB Code>
CIAnO