Vb.net UDP本地广播

Vb.net UDP本地广播,vb.net,udp,broadcast,multicast,udpclient,Vb.net,Udp,Broadcast,Multicast,Udpclient,我在做一个遥控工具。客户端运行一个程序,在本地向服务器发送命令以控制它们 但是,客户端不知道服务器的IP地址,反之亦然 我决定使用UDP广播(请告诉我是否有更好的方法,我尝试过使用多播,但我并不真正理解它)。启动时,客户端(控制服务器)会广播一条消息,告诉服务器新客户端已连接。然后(或服务器启动时),服务器广播自己的IP地址。当客户端收到IP地址时,它会尝试通过TCP进行连接 不幸的是,我遇到了问题。我随机得到一个现有连接被远程主机强制关闭异常,我无法找出原因。 侦听UDP广播时,我的客户端程序

我在做一个遥控工具。客户端运行一个程序,在本地向服务器发送命令以控制它们

但是,客户端不知道服务器的IP地址,反之亦然

我决定使用UDP广播(请告诉我是否有更好的方法,我尝试过使用多播,但我并不真正理解它)。启动时,客户端(控制服务器)会广播一条消息,告诉服务器新客户端已连接。然后(或服务器启动时),服务器广播自己的IP地址。当客户端收到IP地址时,它会尝试通过TCP进行连接

不幸的是,我遇到了问题。我随机得到
一个现有连接被远程主机强制关闭
异常,我无法找出原因。
侦听UDP广播时,我的客户端程序发生异常

现在,我正在寻找一种更好的方式来找到客户。 我应该使用广播还是多播? 我将如何实现这一点

编辑:使用多个端口不会有问题。但是,我需要能够在一台计算机上运行客户端和服务器


这是我使用的代码 客户端(控制服务器)



服务器(由客户端控制)



提前谢谢

我建议使用zerocconf查找服务器和客户端,然后使用TCP套接字在两者之间进行通信。您可以在此处看到键值对zeroconf公告的示例实现:

谢谢您的回答。我通过删除在我的客户端中手动调用
StartBroadcastUdpThread()
的功能来修复它

我仍然不明白为什么会发生这种情况。我对客户端和服务器使用完全相同的代码,只是端口被交换了。即使多次调用
StartBroadcastUdpThread()
方法,TCP服务器也不会崩溃,客户端会崩溃。顺便说一句,不管是先启动客户机还是服务器,都会出现问题


即使我真的不明白为什么第二次广播会阻止客户端接收广播,但现在已经解决了。谢谢你的帮助

最小UDP服务器基础:

Imports System.Threading

Shared client As UdpClient
Shared receivePoint As IPEndPoint

client = New UdpClient(2828) 'Port
receivePoint = New IPEndPoint(New IPAddress(0), 0)

Dim readThread As Thread = New Thread(New ThreadStart(AddressOf WaitForPackets))
readThread.Start()

Public Shared Sub WaitForPackets()
    While True
        Dim data As Byte() = client.Receive(receivePoint)
        Console.WriteLine("=" + System.Text.Encoding.ASCII.GetString(data))
    End While
End Sub

你在两台机器上都检查过防火墙设置了吗?我用一台计算机进行了测试,防火墙设置很好。我甚至完全禁用了防火墙。顺便说一句,连接确实有效,我能够正确接收所有广播,它只是在第二次广播后断开我的连接。
'Variables
Private UdpBroadcaster As UdpClient
Private UdpBroadcasterEndpoint As New IPEndPoint(IPAddress.Broadcast, 4333)

'Main method
Public Sub Main()
    Try
        UdpBroadcaster = New UdpClient(4334)
        UdpBroadcaster.EnableBroadcast = True

        StartUdpListener()
        StartBroadcastUdpThread()
    Catch
        Console.WriteLine("Failed to create server. Port already in use?")
    End Try
End Sub

'Called in Main()
Private Sub StartUdpListener()
    Dim ListenerUdp As New Thread(AddressOf UdpListener)
    ListenerUdp.IsBackground = True
    ListenerUdp.Start()
End Sub

'Started as thread in StartUdpListener()
Private Sub UdpListener()
    Try
        Do
            Dim ReceivedBytes() As Byte = UdpBroadcaster.Receive(UdpBroadcasterEndpoint)
            Dim ReceivedString As String = System.Text.Encoding.UTF32.GetString(ReceivedBytes)

            If ReceivedString.Equals("Client-Identify") Then
                StartBroadcastUdpThread()
            End If
        Loop
    Catch
        If Not UdpBroadcaster Is Nothing Then
            UdpBroadcaster.Close()
        End If
    End Try
End Sub

'Called when the application is started or a "Client-Identify" command is received
Private Sub StartBroadcastUdpThread()
    Dim UdpBroadcastThread As New Thread(Sub() BroadcastUdp())
    UdpBroadcastThread.IsBackground = True
    UdpBroadcastThread.Start()
End Sub

'Started as thread in StartBroadcastUdpThread()
Private Sub BroadcastUdp()
    Dim BroadcastBytes() As Byte = System.Text.Encoding.UTF32.GetBytes(Dns.GetHostName)
    UdpBroadcaster.Send(BroadcastBytes, BroadcastBytes.Length, UdpBroadcasterEndpoint)
End Sub
Imports System.Threading

Shared client As UdpClient
Shared receivePoint As IPEndPoint

client = New UdpClient(2828) 'Port
receivePoint = New IPEndPoint(New IPAddress(0), 0)

Dim readThread As Thread = New Thread(New ThreadStart(AddressOf WaitForPackets))
readThread.Start()

Public Shared Sub WaitForPackets()
    While True
        Dim data As Byte() = client.Receive(receivePoint)
        Console.WriteLine("=" + System.Text.Encoding.ASCII.GetString(data))
    End While
End Sub