Die Community zu .NET und Classic VB.
Menü

Tipp-Upload: VB.NET 0409: BeginAcceptTcpClient

 von 

Hinweis zum Tippvorschlag  

Dieser Vorschlag wurde noch nicht auf Sinn und Inhalt überprüft und die Zip-Datei wurde noch nicht auf schädlichen Inhalt hin untersucht.
Bitte haben Sie ein wenig Geduld, bis die Freigabe erfolgt.

Über den Tipp  

Dieser Tippvorschlag ist noch unbewertet.

Der Vorschlag ist in den folgenden Kategorien zu finden:

  • Internet und Netzwerke

Dem Tippvorschlag wurden folgende Schlüsselwörter zugeordnet:
TcpClient,TcpListener,AcceptTcpClient,BeginAcceptTcpClient,AsyncCallback,EndAcceptTcpClient,Tcp

Der Vorschlag wurde erstellt am: 14.06.2011 15:55.
Die letzte Aktualisierung erfolgte am 14.06.2011 15:55.

Zurück zur Übersicht

Beschreibung  

Der tipp beschreibt wie man einen TcpListener initialisiert, der asyncron auf Clients wartet, ggf. mit diesen kommuniziert, und schliesslich nach Beendigung der Verbindung auf einen neuen client wartet bis lokal der 'Server' runtergefahren wird.

Schwierigkeitsgrad

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

Download:

Download des Beispielprojektes [11,86 KB]

' Dieser Source stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!
'
' Beachten Sie, das vom Designer generierter Code hier ausgeblendet wird.
' In den Zip-Dateien ist er jedoch zu finden.

' ------ Anfang Projektgruppe TestAsyncTcpListener.sln  ------
' ----- Anfang Projektdatei TestAsyncTcpListener.vbproj  -----
' ------------------- Anfang Datei Main.vb -------------------
Option Strict On

Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading

Public Class Main

    Public Shared mreSemaphore As New ManualResetEvent(False)
    Public Shared blnSemaphore As Boolean = False

    Public Shared Sub Main()

        Dim port As Int32 = 22022

        ' Der listener hoert nur auf lokale clients (127.0.0.1:22022)
        Dim tcpl As TcpListener = New TcpListener(New IPEndPoint(IPAddress.Loopback, port))

        Echo("Calling DoAcceptClient")

        Dim trdDAC As New Thread(New ParameterizedThreadStart(AddressOf DoAcceptClient))

        blnSemaphore = True
        trdDAC.Start(tcpl)

        ' Warte bis der nutzer q in die Konsole eingibt.
        Do Until Console.ReadKey(True).KeyChar = "q"
        Loop

        Echo("Received quit command finalizing... ")

        blnSemaphore = False

        ' Semaphore -> Set
        mreSemaphore.Set()

    End Sub

    Public Shared Sub DoAcceptClient(objListener As Object)

        Dim listener As TcpListener = CType(objListener, TcpListener)

        While blnSemaphore
            Echo("Semaphore -> reset")
            mreSemaphore.Reset()

            Echo("Starting listener...")
            listener.Start()

            Echo("Waiting for connection... [BeginAcceptTcpClient]")

            listener.BeginAcceptTcpClient(New AsyncCallback(AddressOf _
                DoAcceptClientCallback), listener)

            Echo("Semaphore -> waitone (set)")
            mreSemaphore.WaitOne()

        End While

        Echo("Left running loop!")

    End Sub

    Public Shared Sub DoAcceptClientCallback(ar As IAsyncResult)

        Dim listener As TcpListener = CType(ar.AsyncState, TcpListener)

        Echo("Casted listener [EndAcceptTcpClient]")

        Dim client As TcpClient = listener.EndAcceptTcpClient(ar)

        Echo("Receiving bytes...")

        Dim lb As Byte = 0

        ' 0x71 entspricht 'q'
        Do Until lb = &H71

            Dim bf() As Byte = New Byte() {0}

            client.Client.Receive(bf)
            lb = bf(0)
            Echo("Received byte: 0x" & Convert.ToString(lb, 16))
            client.Client.Send(New Byte() {&H6})
        Loop

        Echo("Client -> close")
        client.Close()
        Echo("Semaphore -> set")
        mreSemaphore.Set()

    End Sub

    Public Shared Sub Echo(msg As String)

        Console.WriteLine("[{0}]-: {1}", Thread.CurrentThread.ManagedThreadId, msg)

    End Sub

End Class

' -------------------- Ende Datei Main.vb --------------------
' ------ Ende Projektdatei TestAsyncTcpListener.vbproj  ------
' ------- Ende Projektgruppe TestAsyncTcpListener.sln  -------

	

Diskussion  

Diese Funktion ermöglicht es, Fragen, die die Veröffentlichung des Tipps betreffen, zu klären, oder Anregungen und Verbesserungsvorschläge einzubringen. Nach der Veröffentlichung des Tipps werden diese Beiträge nicht weiter verlinkt. Allgemeine Fragen zum Inhalt sollten daher hier nicht geklärt werden.
Folgende Diskussionen existieren bereits

Um eine Diskussion eröffnen zu können, müssen sie angemeldet sein.