Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Sockets
Forum - C# / VB.NET - Sockets

Avatar
klez91 (Normal User)
Pro


Messaggi: 117
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 16:58
Martedì, 10/06/2008
Questo topic è stato chiuso dal moderatore

Rieccomi dinuovo qua con un'altra domanda sui sockets, ormai qst è un'argomento che mi appassiona :). Questo volta vi chiedo se fosse possibile creare un server che gestisca le connessioni in entrata, accettando una richiesta allo volta( scelta dall'utente)e mettendo in attesa le altre x poi accettarle in un secondo momento. Io avevo pensato a una ListBox che per ogni richiesta di connessione aggiungesse alla lista l'IP del client, e l'utente sceglie dalla lista quale IP accettare... Secondo voi è fattibile( in Vb.Net ovviamente)????? Grazie mille!!!

Ultima modifica effettuata da klez91 il 11/06/2008 alle 12:36
PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 20:57
Mercoledì, 11/06/2008
Sì è possibile, ma per sapere l'IP di una connesione in entrata devi prima accettare la stessa connessione. Inoltre il server non può accettare più di un numero massimo di connessione che decidi tu.

PM
Avatar
klez91 (Normal User)
Pro


Messaggi: 117
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 13:04
Giovedì, 12/06/2008
Grazie Totem per la risposta. Volevo chiederti 2 cose. Come faccio a stabilire il numero massimo di connessioni ??? Poi secondo te come potrei fare im modo che per ogni client in attesa venga aggiunto ad una ListBox un item del tipo "C'è un nuovo client in attesa numero n( dove n sia un numero o una lettera che comunque lo distingua dagli altri client)" e l'utente a secondo del client selezionato decide di accettare tale connessione ???? Grazie ancora!

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 15:53
Giovedì, 12/06/2008
Testo quotato

Postato originariamente da klez91:

Grazie Totem per la risposta. Volevo chiederti 2 cose. Come faccio a stabilire il numero massimo di connessioni ??? Poi secondo te come potrei fare im modo che per ogni client in attesa venga aggiunto ad una ListBox un item del tipo "C'è un nuovo client in attesa numero n( dove n sia un numero o una lettera che comunque lo distingua dagli altri client)" e l'utente a secondo del client selezionato decide di accettare tale connessione ???? Grazie ancora!



Per stabilire il numero massimo di connessione devi usare un particolare overload di Start (metodo della classe TcpListener o Socket), che accetta un solo parametro intero specificante il massimo di connessioni simultanee possibili.
Codice sorgente - presumibilmente Plain Text

  1. Listener.Start(3)



Come detto prima, per sapere l'IP devi accettare la connessione in entrata, e dato che i client in attesa non si possono memorizzare se non accettandoli, devi per forza prima di ogni altra cosa accettare la connessione. Dopodiché puoi inviare al client una stringa che definisci tu, ad esempio "WAIT" che indica di aspettare, quindi memorizzi il TcpClient associato in una lista qualsiasi e aggiungi alla listbox il suo ip. Fatto ciò, quando l'utente sul server sceglie un ip dalla listbox recuperi il tcpclient associato e mandi un messaggio di conferma o di negazione. In caso di negazione, il client si disconnette

Il procedimento è un po' macchinoso, ma credo che funzioni.

PM
Avatar
klez91 (Normal User)
Pro


Messaggi: 117
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 19:36
Giovedì, 12/06/2008
Il ragionamento non fa una piega grazie, però prima di metterlo in atto ho provato a fare delle prove appunto per la gestione di due connessione su un server utilizanndo il seguente codice ke però mi da alcuni problemi. Infatti il client non è in grado di comunicare con il server finchè tutte le connessioni stabilite nell'overload di star non sono state effettuate. Non riesco a capire il perché. Potresti aiutarmi ancora una volta, grazie ?
Ecco il sorgente :
Codice sorgente - presumibilmente VB.NET

  1. Imports System.Net
  2. Imports System.Net.Sockets
  3.  
  4. Public Class Form1
  5.     Public Client1, Client2 As New TcpClient
  6.     Public Ascolta As New TcpListener(256)
  7.     Public NetStream1, NetStream2 As NetworkStream
  8.    
  9.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  10.         Ascolta.Start(2)
  11.         tmrPending.Start()
  12.     End Sub
  13.  
  14.     Private Sub tmrPending_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrPending.Tick
  15.         If Ascolta.Pending Then
  16.             Client1 = Ascolta.AcceptTcpClient
  17.             NetStream1 = Client1.GetStream
  18.             tmrDati.Start()
  19.             Client2 = Ascolta.AcceptTcpClient
  20.             NetStream2 = Client2.GetStream
  21.         End If
  22.  
  23.     End Sub
  24.  
  25.     Private Sub tmrDat1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrDati.Tick
  26.         If Client1.Available > 0 And NetStream1.CanRead Then
  27.             Dim Bytes(Client1.ReceiveBufferSize) As Byte
  28.             NetStream1.Read(Bytes, 0, Client1.ReceiveBufferSize)
  29.             MsgBox("Client1 ha inviato: " & System.Text.ASCIIEncoding.ASCII.GetString(Bytes))
  30.         End If
  31.         If Client2.Available > 0 And NetStream2.CanRead Then
  32.             Dim Bytes2(Client2.ReceiveBufferSize) As Byte
  33.             NetStream2.Read(Bytes2, 0, Client2.ReceiveBufferSize)
  34.             MsgBox("Client2 ha inviato: " & System.Text.ASCIIEncoding.ASCII.GetString(Bytes2))
  35.         End If
  36.     End Sub
  37. End Class


PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 16:23
Venerdì, 13/06/2008
Testo quotato

Postato originariamente da klez91:

Il ragionamento non fa una piega grazie, però prima di metterlo in atto ho provato a fare delle prove appunto per la gestione di due connessione su un server utilizanndo il seguente codice ke però mi da alcuni problemi. Infatti il client non è in grado di comunicare con il server finchè tutte le connessioni stabilite nell'overload di star non sono state effettuate. Non riesco a capire il perché. Potresti aiutarmi ancora una volta, grazie ?
Ecco il sorgente :
Codice sorgente - presumibilmente VB.NET

  1. Imports System.Net
  2. Imports System.Net.Sockets
  3.  
  4. Public Class Form1
  5.     Public Client1, Client2 As New TcpClient
  6.     Public Ascolta As New TcpListener(256)
  7.     Public NetStream1, NetStream2 As NetworkStream
  8.    
  9.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  10.         Ascolta.Start(2)
  11.         tmrPending.Start()
  12.     End Sub
  13.  
  14.     Private Sub tmrPending_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrPending.Tick
  15.         If Ascolta.Pending Then
  16.             Client1 = Ascolta.AcceptTcpClient
  17.             NetStream1 = Client1.GetStream
  18.             tmrDati.Start()
  19.             Client2 = Ascolta.AcceptTcpClient
  20.             NetStream2 = Client2.GetStream
  21.         End If
  22.  
  23.     End Sub
  24.  
  25.     Private Sub tmrDat1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrDati.Tick
  26.         If Client1.Available > 0 And NetStream1.CanRead Then
  27.             Dim Bytes(Client1.ReceiveBufferSize) As Byte
  28.             NetStream1.Read(Bytes, 0, Client1.ReceiveBufferSize)
  29.             MsgBox("Client1 ha inviato: " & System.Text.ASCIIEncoding.ASCII.GetString(Bytes))
  30.         End If
  31.         If Client2.Available > 0 And NetStream2.CanRead Then
  32.             Dim Bytes2(Client2.ReceiveBufferSize) As Byte
  33.             NetStream2.Read(Bytes2, 0, Client2.ReceiveBufferSize)
  34.             MsgBox("Client2 ha inviato: " & System.Text.ASCIIEncoding.ASCII.GetString(Bytes2))
  35.         End If
  36.     End Sub
  37. End Class




Come alternativa puoi reinizializzare un nuovo listener ad ogni connessione accettata.

Quando Peding restituisce True, significa che c'è una connessione in attesa, ma tu le accetti entrambe, ossia client2 e client1 rappresentano la stessa connessione. Una volta ricevute e accettate le richieste, dovresti mandare la stringa Wait di prima, cosa che qui non hai fatto. Forse è meglio che semplifichi le cose usando un array o una lista.

PM
Avatar
klez91 (Normal User)
Pro


Messaggi: 117
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 15:05
Sabato, 14/06/2008
Grazie Totem per il momento ho risolto! Prima di postare il sorgente sopra avevo provato a impostare i vari TCPClient utilizzando vari "if ...Pending" ma erano sorti altri problemi di conessione. Per il fatto della stringa "WAIT" nel sorgente non l'ho messo perché stavo cercando di capire prima un po il funzionamento della connessione multipla, e poi successivamente avrei implementato tutto nel mio progetto. Per il resto ho risolto con un array di TCPClient e NetworkStream associato. Thanks :k: !!!

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 13:34
Domenica, 15/06/2008
Ok, allora posso chiudere.

PM