Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
21/12/10 19:59
Question
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:
Imports System.Net
Imports System.Net.Sockets

Class MikleSocket
    Private _Status As Byte = 0
    Private LocalIP As IPAddress = Dns.Resolve(Dns.GetHostName).AddressList(0)
    Private sckListener As TcpListener, sckClient As TcpClient
    Public Event ConnectionRequest As System.ComponentModel.CancelEventHandler
    Public Event Connecting As System.ComponentModel.CancelEventHandler
    Public Event Connected As System.EventHandler

    Public ReadOnly Property Status As String
        Get
            Select Case _Status
                Case 0
                    Return "Disconnected"
                Case 1
                    Return "Listening"
                Case 2
                    Return "Connected"
                Case 3
                    Return "Waiting"
                Case Else
                    Return "Unknow"
            End Select
        End Get
    End Property

    Public Sub Listen(ByVal Port As Int16)
        Dim e As New System.ComponentModel.CancelEventArgs
        sckListener = New TcpListener(LocalIP, Port)
        sckListener.Start()
        _Status = 1
        Do Until sckListener.Pending
            Application.DoEvents()
        Loop
        _Status = 3
        RaiseEvent ConnectionRequest(Me, e)
        If e.Cancel = False Then
            sckListener.AcceptTcpClient()
            _Status = 2
        End If
    End Sub

    Public Sub Connect(ByVal Host as String,ByVal Port as Int16)
        Dim e As New System.ComponentModel.CancelEventArgs
        sckClient = New TcpClient(Host, Port)
        _Status = 3
        RaiseEvent Connecting(Me, e)
        If e.Cancel Then
            sckClient.Close()
            _Status = 0
        End If
        Do Until sckClient.Connected
            Application.DoEvents()
        Loop
        _Status = 2
        RaiseEvent Connected(Me, EventArgs.Empty)
    End Sub
End Class
Ultima modifica effettuata da Question 21/12/10 22:54
aaa
22/12/10 7:22
HeDo

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.
aaa
22/12/10 13:00
Question
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 22/12/10 13:01
aaa
22/12/10 16:01
Question
-.-
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:
aaa