Socket mit Controll-Array (addHandler)

  • VB.NET

Es gibt 53 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Socket mit Controll-Array (addHandler)

    Guten Abend Community,

    ich hab da ein Problem...

    Mein Programm lässt mehrere socket-verbindungen zu, bloß ich kann sie nicht einzeln schließen, da ich sie nicht einzeln ansprechen kann... :(
    Ich hab damals auch schon hier in einem anderen thread danach gefragt...da kam als antwort, ich sollte es mit einem controll-array (addHandler etc.) versuchen

    hier der link von microsoft msdn.microsoft.com/de-de/library/bb979199.aspx

    jetzt ist mein problem, dass ich das irgendwie nicht gebacken bekommen

    Das ist mein einfacher Quelltext für die verbindungen:


    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.Net
    3. Imports System.IO
    4. Imports System.Threading
    5. Public Class Form1
    6. Dim anzahl As Integer = 5
    7. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    8. Dim server As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP)
    9. Dim ipAddress As IPAddress = ipAddress.Parse("192.168.120.1")
    10. Dim localEP As New IPEndPoint(ipAddress, 10000)
    11. server.Bind(localEP)
    12. server.Listen(anzahl)
    13. End Sub
    14. End Class


    Jetzt weiß ich halt nicht wie ich diesen sogenannten addhandler darin einbinde, hab mir zwar das beispiel von microsoft angeschaut, aber irgendwie den durchblick dabei verloren.... ?(

    Man kann so etwas auch mit tcpclient / tcplistener realisieren soweit ich weiß....


    Für Tipps, Vorschläge und Hilfevorstellungen wäre ich sehr dankbar
    AddHandler sind für dynamisch erzeugete Klassen/Controls, bei denen man die Events in einer bestimmten Prozedur abfangen will.

    Insofern muss da erstmal ein Event vorhanden oder deklariert werden. Das sehe ich bei Deinem Code nicht.
    Ja, aber wie mache ich denn sowas??
    Kann mir da nicht jemand mal eine kleine Hilfestellung geben...

    Ich hab da jetzt einen Event drin, aber wie gehts jetzt weiter??



    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.Net
    3. Imports System.IO
    4. Imports System.Threading
    5. Public Class Form1
    6. Dim anzahl As Integer = 5
    7. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    8. Dim server As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP)
    9. Dim ipAddress As IPAddress = ipAddress.Parse("192.168.120.1")
    10. Dim localEP As New IPEndPoint(ipAddress, 10000)
    11. server.Bind(localEP)
    12. server.Listen(anzahl)
    13. End Sub
    14. Private Sub btnstart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnstart.Click
    15. 'und jetzt???
    16. End Sub
    17. End Class
    Ich denke Du hast hier mehr ein Problem mit Deinem Gesamtkonzept als mit Detailfragen. Insofern wäre es vielleicht ganz gut wenn Du uns mit Pseudo-Code beschreiben würdest was Dein Programm so ungefähr macht und wo Dein Problem liegt.

    Was normalerweise immer vorliegt ist
    - ein serverSocket der async oder auf einem eigenen Thread auf neue Connections wartet
    - bei neuem Connect wird ein neuer receiveSocket instanziert, wird in eine receiveListe eingetragen und bekommt einen eigenen receiveThread
    - bei receiveSocket.connection close trägt er sich aus der Liste aus und beendet sich
    - bei closen des Hauptprogramms beendet es sauber alle sockets in der receiveListe und aborted die threads

    Du hast also im Gegensatz zu Deiner Anfangsaussage schon eine Liste (List (of socket)), wo Deine vermutlich aktiven Verbindungen drinliegen.

    Wie kommunizieren die aber mit Deinem Hauptprogramm wenn nötig ?
    - über events ?
    - über callback ?

    Falls Du eine receiveSocket Klasse mit Events hast, dann erst kommen die eventHandler ins Spiel.
    Hi, erstmal vielen Dank für die vielen Tipps :) Werde sie gleich mal ausprobieren

    Mein Programm soll einfach Socket-verbindungen auf einer bestimmten ip-adresse & port zulassen und diese dann in einer liste jeweils anzeigen. Dazu soll man halt noch sehen welcher Socket sich verbunden hat / bzw. man soll entscheiden können, welcher socket man wieder schließen möchte...(grob gesagt man soll die Sockets identifizieren können, um damit arbeiten zu können)

    Bsp:

    Socket1 verbunden
    Socket2 verbunden
    Socket3 verbunden

    Jetzt möchte man Socket2 wieder schließen, ohne dass die anderen Sockets auch geschlossen werden


    Ja, das wäre halt mein Problem.... ?(
    einen Socket "akzeptierst" du mit BeginAccept(und einem Callback)...im Callback erhälst du dann einen Socket(durch die EndAccept Funktion), welchen du in einem Array speichern kannst, über Shutdown und Close kannst du diese dann auch wieder schließen ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ein Beispiel für den serverSocket findest Du zum Beispiel hier. Allerdings kein Async Accept, sondern er pollt auf einem eigenen Thread nach Accept.Requests . Dafür ist das Beispiel aber relativ übersichtlich. Ein (unübersichtliches) Beispiel für einen Async Server findest Du im Link unten auf der gleichen Seite.

    Überleg Dir ob Du für die clientSockets eine eigene Klasse anlegst, die in einer shared Liste die eigenen Instanzen beinhaltet. Hier passt dann auch das Threading, Exceptions, Events usw. rein.
    Hi Community,

    ich hab ein Problem mit dem Socket, die ich in einem Array speichern möchte...
    Mit den Threads und so klappt alles wunderbar, bloß das speichern klappt nicht, weil ich irgendwie nicht verstehe wie ich die sockets in einem array speichern kann....(ich weiß was ein array ist und wie man es anlegt), bloß wie gesagt nicht mit Sockets...

    Hier ist mein Quelltext:

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.IO
    3. Imports System.Net
    4. Imports System.Threading
    5. Public Class Form1
    6. Dim servsocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
    7. Dim servIP As IPAddress = IPAddress.Parse("192.168.120.1")
    8. Dim port As Integer = 12345
    9. Dim anzahl As Integer = 5
    10. Dim servhost As New IPEndPoint(servIP, port)
    11. Dim clientnr() As Socket
    12. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    13. servsocket.Bind(servhost)
    14. servsocket.Listen(anzahl)
    15. Dim lclient As New Listen2Client(servsocket)
    16. Dim servthread As Thread
    17. servthread = New Thread(New ThreadStart(AddressOf lclient.Servthreadprog))
    18. servthread.Start()
    19. End Sub
    20. End Class
    21. Public Class Listen2Client
    22. Public index As Integer = 1
    23. Public beschr As String = "Client-Nr. "
    24. Private servsocket As Socket
    25. Private clientSocket As Socket
    26. Public Sub New(ByVal servsocket As Socket)
    27. Me.servsocket = servsocket
    28. End Sub
    29. Public Sub Servthreadprog()
    30. Do While True
    31. Dim clientSocket As Socket = servsocket.Accept()
    32. Call getIndex()
    33. Loop
    34. 'index = index + 1
    35. End Sub
    36. Public Sub getIndex()
    37. MsgBox(beschr & index & " angemeldet")
    38. '.....
    39. End Sub
    40. End Class



    Kann da jemand bitte helfen?

    Vielen vielen Dank schon mal im Voraus

    VB.NET-Quellcode

    1. Dim clientSocket As Socket = servsocket.Accept()
    2. Call getIndex()

    clientSocket zu dem Array hinzufügen, dann vergiss das mit dem AsyncAccept, auch wenns wesentlich geschickter und performanter wäre...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Erstmal ein dickes dankeschön für eure Hilfe ;)

    Ein kurze frage habe ich noch:
    wie kann ich im hauptformular (also form1), auf die clientlist zugreifen?
    gibts da eine einfache methode oder muss ich es mit besonderen befehlen arbeiten?
    ok, ich habs mit public deklariert, aber klappt nicht so richtig....

    wie kann ich denn die einzeln sockets der liste in einer listbox anzeigen lassen?

    hier ist der quelltext:

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.IO
    3. Imports System.Net
    4. Imports System.Threading
    5. Public Class Form1
    6. Dim servsocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
    7. Dim servIP As IPAddress = IPAddress.Parse("127.0.0.1")
    8. Dim port As Integer = 12345
    9. Dim anzahl As Integer = 5
    10. Dim servhost As New IPEndPoint(servIP, port)
    11. Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    12. servsocket.Bind(servhost)
    13. servsocket.Listen(anzahl)
    14. Dim lclient As New Listen2Client(servsocket)
    15. Dim servthread As Thread
    16. servthread = New Thread(New ThreadStart(AddressOf lclient.Servthreadprog))
    17. servthread.Start()
    18. End Sub
    19. Private Sub btnstart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnstart.Click
    20. 'ListBox1.Items.Add()
    21. End Sub
    22. End Class
    23. Public Class Listen2Client
    24. Public index As Integer = 1
    25. Public beschr As String = "Client-Nr. "
    26. Private servsocket As Socket
    27. Private clientSocket As Socket
    28. Public clientliste As New List(Of Socket)
    29. Public Sub New(ByVal servsocket As Socket)
    30. Me.servsocket = servsocket
    31. End Sub
    32. Public Sub Servthreadprog()
    33. Do While True
    34. Dim clientSocket As Socket = servsocket.Accept()
    35. Call getIndex()
    36. index = index + 1
    37. Loop
    38. End Sub
    39. Public Sub getIndex()
    40. MsgBox(beschr & index & " angemeldet")
    41. clientliste.Add(clientSocket)
    42. End Sub
    43. End Class
    das deklarierst du außerhalb von Form_Load als Private/Public:

    Dim lclient As New Listen2Client(servsocket)


    nun kannst du überall mit lclient.clientliste auf die Liste zugreifen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Alles klar danke für die Info! Hat super geklappt :)

    Mal eine andere Frage, wie kann ich denn hierbei mit dem "ConnectEvent" arbeiten bzw. wie würde dazu der Quelltext aussehen, dass sich zum Beispiel, bei einer Verbindung irgendetwas passiert (meldung, eintrag in einer tabelle oder so, etc.)?

    VB.NET-Quellcode

    1. Private Sub clientSocket_ConnectEvent(ByVal sender As System.Object, ByVal e As System.EventArgs)
    2. End Sub


    oder wie genau? ?(
    Welches ConnectEvent ? Das gibt es ja noch garnicht, da die Klasse Socket das nicht zur Verfügung stellt. Wenn Du also gerne beim Accept ein Event hättest, dann musst Du das Event erst einmal selber definieren, inclusive der Argumente die Du übergeben möchtest. Wie das geht steht hier. Bitte genau lesen.

    Beachten: ein Event läuft im gleichen Thread wie die Prozedur die es auslöst, hier also Dein Servthreadprog()