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 - Classe personalizzata di socket
Forum - C# / VB.NET - Classe personalizzata di socket

Avatar
Question (Normal User)
Rookie


Messaggi: 58
Iscritto: 14/12/2010

Segnala al moderatore
Postato alle 20:59
Martedì, 21/12/2010
Questo topic è stato chiuso dal moderatore

Ciao a tutti,
starei provando a creare una classe personalizzata di socket per "simulare" gli eventi del vecchio winsock e per esercitarmi un po' (non mi piaceva per niente l'idea di usare dei timer).

Per ora ho scritto veramente poco e credo che il codice non abbia bisogno di commenti o di essere spiegato,vi chiedo dunque di dargli una letta.
Ovviamente il problema è che una volta avviata la procedura Listen rimane fermo al ciclo Do,così ho pensato di implementare altri due metodi chiamati ConnectAsync e ListenAsync usando i thread,quà però succede una cosa che non mi torna:
"Impossibile stabilire una connessione. Rifiuto persistente del computer 127.0.0.1:200"

Qui sotto trovate l'intera classe priva dei metodi async (data la mia grande conoscenza dei thread ho pensato che il tutto derivasse da una mia pessima gestione di questi oggetti xD).

Potete aiutarmi con i thread? O c'è un modo migliore per fare quello che voglio fare? :hail:
Codice sorgente - presumibilmente VB.NET

  1. Imports System.Net
  2. Imports System.Net.Sockets
  3.  
  4. Class MikleSocket
  5.     Private _Status As Byte = 0
  6.     Private LocalIP As IPAddress = Dns.Resolve(Dns.GetHostName).AddressList(0)
  7.     Private sckListener As TcpListener, sckClient As TcpClient
  8.     Public Event ConnectionRequest As System.ComponentModel.CancelEventHandler
  9.     Public Event Connecting As System.ComponentModel.CancelEventHandler
  10.     Public Event Connected As System.EventHandler
  11.  
  12.     Public ReadOnly Property Status As String
  13.         Get
  14.             Select Case _Status
  15.                 Case 0
  16.                     Return "Disconnected"
  17.                 Case 1
  18.                     Return "Listening"
  19.                 Case 2
  20.                     Return "Connected"
  21.                 Case 3
  22.                     Return "Waiting"
  23.                 Case Else
  24.                     Return "Unknow"
  25.             End Select
  26.         End Get
  27.     End Property
  28.  
  29.     Public Sub Listen(ByVal Port As Int16)
  30.         Dim e As New System.ComponentModel.CancelEventArgs
  31.         sckListener = New TcpListener(LocalIP, Port)
  32.         sckListener.Start()
  33.         _Status = 1
  34.         Do Until sckListener.Pending
  35.             Application.DoEvents()
  36.         Loop
  37.         _Status = 3
  38.         RaiseEvent ConnectionRequest(Me, e)
  39.         If e.Cancel = False Then
  40.             sckListener.AcceptTcpClient()
  41.             _Status = 2
  42.         End If
  43.     End Sub
  44.  
  45.     Public Sub Connect(ByVal Host as String,ByVal Port as Int16)
  46.         Dim e As New System.ComponentModel.CancelEventArgs
  47.         sckClient = New TcpClient(Host, Port)
  48.         _Status = 3
  49.         RaiseEvent Connecting(Me, e)
  50.         If e.Cancel Then
  51.             sckClient.Close()
  52.             _Status = 0
  53.         End If
  54.         Do Until sckClient.Connected
  55.             Application.DoEvents()
  56.         Loop
  57.         _Status = 2
  58.         RaiseEvent Connected(Me, EventArgs.Empty)
  59.     End Sub
  60. End Class


Ultima modifica effettuata da Question il 21/12/2010 alle 23:54
PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Up
1
Down
V
Segnala al moderatore
Postato alle 8:22
Mercoledì, 22/12/2010

tre anni fa mi è stato chiesto di realizzare una coppia di classi clientsocket e serversocket per un lavoro, non è stato difficile in quanto per gestire gli eventi mi appoggiavo ad un thread chiamato Worker che rimaneva in attesa dei dati dopo l'avvenuta connessione.

ricordati di decidere sempre quali metodi saranno blocking e quali no, in questo modo chi utilizzerà la classe saprà se un metodo gli bloccherà il flusso di esecuzione oppure no.

PM
Avatar
Question (Normal User)
Rookie


Messaggi: 58
Iscritto: 14/12/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 14:00
Mercoledì, 22/12/2010
Il problema è che non riesco neanche a farli connettere :S
Se creo due oggetti Test1 e Test2 della classe Miklesocket (opportunamente modificata con due metodi che non fanno altro che creare un thread,rispettivamente uno per il Listen e l'altro per il Connect),mettendo in ascolto Test1 su localhost:200 e facendo connettere Test2 su localhost:200 mi viene restituito un errore che ho scritto nel topic

Ora darò una letta al Worker sperando che possa aiutarmi. :yup:

Ultima modifica effettuata da Question il 22/12/2010 alle 14:01
PM
Avatar
Question (Normal User)
Rookie


Messaggi: 58
Iscritto: 14/12/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 17:01
Mercoledì, 22/12/2010
-.-
Ho scoperto che il mio sistema di thread andava benissimo e che in realtà il problema era nel costruttore del tcpclient
Praticamente se uso l'obsoleto con solo Port si connette,sennò restituisce errore.
Penso sia dovuto al fatto che il tcpclient manda la richiesta con Host as string e port as integer

Grazie lo stesso :k:

PM