Bei TCP Port mehrmals verwenden

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Memo.

    Bei TCP Port mehrmals verwenden

    Hallo,
    ich versuche mich mit Chat-Programmen und komm auch ziemlich gut weiter, aber nun steck ich wieder.

    Das Problem ist, dass man einen Port nur einmal verwenden darf.
    Meine Lösung war, dass ich einfach nach jedem Senden/Empfangen den Port um eins erhöht habe.
    Nur irgendwie stimmen die Ports nach einiger Zeit nicht mehr zusammen -> Keine Verbindung.

    Da die Fehlermeldung "Normalerweise darf ein Port nur einmal verwendet werden blabla" heißt, habe ich die Vermutung, dass es eine Möglichkeit gibt einen Port mehmals zu verwenden.
    Wenn es diese gibt, wie schaut sie dann aus?

    Code (Konsole)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.Net
    3. Imports System.Text
    4. Imports System.Threading
    5. Module Module1
    6. Dim first = True
    7. Sub StartEmpfang()
    8. Dim t As New Thread(AddressOf Empfangen)
    9. t.Start()
    10. End Sub
    11. Sub Main()
    12. Console.SetWindowSize(69, 69)
    13. If first Then StartEmpfang()
    14. Console.ForegroundColor = ConsoleColor.Green
    15. Dim str = Console.ReadLine()
    16. If str = "?" Then
    17. Console.WriteLine("Port zum empfangen: " & empfangsport)
    18. Console.WriteLine("Port zum senden: " & senderPort)
    19. Main()
    20. Exit Sub
    21. End If
    22. Console.ResetColor()
    23. Dim t As New Thread(AddressOf Senden)
    24. t.Start(str)
    25. first = False
    26. Main()
    27. End Sub
    28. Sub Empfangen()
    29. Dim clientSocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
    30. Dim ip = GetIp()
    31. Dim ipEnd As New IPEndPoint(ip, empfangsport)
    32. Try
    33. clientSocket.Connect(ipEnd)
    34. Catch ex As Exception
    35. Empfangen()
    36. Exit Sub
    37. End Try
    38. Dim bytes(1023) As Byte
    39. Console.WriteLine("Empfangen ...")
    40. empfangsport += 1
    41. Try
    42. clientSocket.Receive(bytes, bytes.Length, SocketFlags.None)
    43. If Not myProgIsTheSender Then
    44. senderPort += 1
    45. End If
    46. Catch ex As Exception
    47. Console.ForegroundColor = ConsoleColor.Red
    48. Console.WriteLine("Verbindung geschlossen...")
    49. Console.ResetColor()
    50. empfangsport += 1
    51. Empfangen()
    52. End Try
    53. Console.ForegroundColor = ConsoleColor.Green
    54. Console.WriteLine(Trim(Encoding.Default.GetString(bytes)))
    55. Console.ResetColor()
    56. Empfangen()
    57. End Sub
    58. Function GetIp() As IPAddress
    59. For Each i In Dns.GetHostEntry("localhost").AddressList
    60. If i.AddressFamily = AddressFamily.InterNetwork Then
    61. Return i
    62. End If
    63. Next
    64. Return IPAddress.Loopback
    65. End Function
    66. Dim _senderPort = 1
    67. Dim _empfangsport = 1
    68. Property senderPort() As Integer
    69. Get
    70. Return _senderPort
    71. End Get
    72. Set(ByVal value As Integer)
    73. _senderPort = value
    74. Console.WriteLine("Port zum senden: " & value)
    75. End Set
    76. End Property
    77. Property empfangsport() As Integer
    78. Get
    79. Return _empfangsport
    80. End Get
    81. Set(ByVal value As Integer)
    82. _empfangsport = value
    83. Console.WriteLine("Port zum empfangen: " & value)
    84. End Set
    85. End Property
    86. Dim _myProgIsTheSender = False
    87. Property myProgIsTheSender() As Boolean
    88. Get
    89. Return _myProgIsTheSender
    90. End Get
    91. Set(ByVal value As Boolean)
    92. _myProgIsTheSender = value
    93. Console.WriteLine("Dieses Programm sendet: " & value)
    94. End Set
    95. End Property
    96. Sub Senden(ByVal str As String)
    97. Dim clientSocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
    98. Dim ip = GetIp()
    99. Dim ipEnd As New IPEndPoint(ip, senderPort)
    100. 1: Try
    101. clientSocket.Bind(ipEnd)
    102. Catch ex As Exception
    103. senderPort += 1
    104. GoTo 1
    105. End Try
    106. Try
    107. clientSocket.Listen(1)
    108. Catch ex As Exception
    109. Senden(str)
    110. Exit Sub
    111. End Try
    112. Dim senderSocket = clientSocket.Accept()
    113. Dim bytes = Encoding.Default.GetBytes(str)
    114. Console.WriteLine("Senden...")
    115. myProgIsTheSender = True
    116. senderSocket.Send(bytes, bytes.Length, SocketFlags.None)
    117. myProgIsTheSender = False
    118. senderPort += 1
    119. End Sub
    120. End Module

    Das Problem ist, dass man einen Port nur einmal verwenden darf.
    Meine Lösung war, dass ich einfach nach jedem Senden/Empfangen den Port um eins erhöht habe.

    Irgendwo machst du was gehörig falsch. Ich hab vor langer Zeit mal mit kevins Tutorial nen simplen TCP-Chat gebaut, und dort musste ich nie den Port wechseln. o_O
    Und beim TCPClient ist es meines Wissens ebenfalls so, da musst du dann eine Eigenschaft einstellen:
    msdn.microsoft.com/de-de/libra….exclusiveaddressuse.aspx

    Und wenn der Server nicht sauber beendet wurde, musst du beim nächsten mal starten einen anderen Port verwenden(oder warten bis der Port autom. vom Betriebssystem wieder freigegeben ist...)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    nö, nur beim endgültigen Beenden sauber Beenden...
    Close schließt nur das .Net Objekt, nicht aber die eigentliche Verbindung, dafür musst du alle Streams schließen und den Listener stoppen(wenn du den denn verwendest)...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Erstell beim server doch einfach eine schleife, der server wird die daten von allen clienten empfangen, und alles in einem port. dann, wenn der server beendet wird, werden die ports wieder geschlossen, so das der computer wieder sicher ist.
    Hab ich doch die ganze Zeit gesagt, wenn der Server sauber beendet wird, ansonsten müsste man warten, bis es vom Betriebssystem wieder freigegeben ist...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---