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
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)
VB.NET-Quellcode
- Imports System.Net.Sockets
- Imports System.Net
- Imports System.Text
- Imports System.Threading
- Module Module1
- Dim first = True
- Sub StartEmpfang()
- Dim t As New Thread(AddressOf Empfangen)
- t.Start()
- End Sub
- Sub Main()
- Console.SetWindowSize(69, 69)
- If first Then StartEmpfang()
- Console.ForegroundColor = ConsoleColor.Green
- Dim str = Console.ReadLine()
- If str = "?" Then
- Console.WriteLine("Port zum empfangen: " & empfangsport)
- Console.WriteLine("Port zum senden: " & senderPort)
- Main()
- Exit Sub
- End If
- Console.ResetColor()
- Dim t As New Thread(AddressOf Senden)
- t.Start(str)
- first = False
- Main()
- End Sub
- Sub Empfangen()
- Dim clientSocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
- Dim ip = GetIp()
- Dim ipEnd As New IPEndPoint(ip, empfangsport)
- Try
- clientSocket.Connect(ipEnd)
- Catch ex As Exception
- Empfangen()
- Exit Sub
- End Try
- Dim bytes(1023) As Byte
- Console.WriteLine("Empfangen ...")
- empfangsport += 1
- Try
- clientSocket.Receive(bytes, bytes.Length, SocketFlags.None)
- If Not myProgIsTheSender Then
- senderPort += 1
- End If
- Catch ex As Exception
- Console.ForegroundColor = ConsoleColor.Red
- Console.WriteLine("Verbindung geschlossen...")
- Console.ResetColor()
- empfangsport += 1
- Empfangen()
- End Try
- Console.ForegroundColor = ConsoleColor.Green
- Console.WriteLine(Trim(Encoding.Default.GetString(bytes)))
- Console.ResetColor()
- Empfangen()
- End Sub
- Function GetIp() As IPAddress
- For Each i In Dns.GetHostEntry("localhost").AddressList
- If i.AddressFamily = AddressFamily.InterNetwork Then
- Return i
- End If
- Next
- Return IPAddress.Loopback
- End Function
- Dim _senderPort = 1
- Dim _empfangsport = 1
- Property senderPort() As Integer
- Get
- Return _senderPort
- End Get
- Set(ByVal value As Integer)
- _senderPort = value
- Console.WriteLine("Port zum senden: " & value)
- End Set
- End Property
- Property empfangsport() As Integer
- Get
- Return _empfangsport
- End Get
- Set(ByVal value As Integer)
- _empfangsport = value
- Console.WriteLine("Port zum empfangen: " & value)
- End Set
- End Property
- Dim _myProgIsTheSender = False
- Property myProgIsTheSender() As Boolean
- Get
- Return _myProgIsTheSender
- End Get
- Set(ByVal value As Boolean)
- _myProgIsTheSender = value
- Console.WriteLine("Dieses Programm sendet: " & value)
- End Set
- End Property
- Sub Senden(ByVal str As String)
- Dim clientSocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
- Dim ip = GetIp()
- Dim ipEnd As New IPEndPoint(ip, senderPort)
- 1: Try
- clientSocket.Bind(ipEnd)
- Catch ex As Exception
- senderPort += 1
- GoTo 1
- End Try
- Try
- clientSocket.Listen(1)
- Catch ex As Exception
- Senden(str)
- Exit Sub
- End Try
- Dim senderSocket = clientSocket.Accept()
- Dim bytes = Encoding.Default.GetBytes(str)
- Console.WriteLine("Senden...")
- myProgIsTheSender = True
- senderSocket.Send(bytes, bytes.Length, SocketFlags.None)
- myProgIsTheSender = False
- senderPort += 1
- End Sub
- End Module