当前位置: 首页 > 知识库问答 >
问题:

为什么不传送本地UDP数据包?

谷梁星雨
2023-03-14

我正在尝试编写一个非常简单的UDP客户机/服务器对,它将在同一台计算机上一起工作(目前),但是我的包没有一个被传送。以下代码是一个100%完整的VB.NET控制台应用程序。它运行时不会抛出错误,但是mListener。接收命令从不返回。

问题 1:为什么我没有收到任何数据包?

问题2:为什么我不能让我的客户使用IP地址。有没有终点?当我尝试连接到NewIPEndPoint(IPAddress.Any,10123)时,我得到一个“请求的地址在其上下文中无效0.0.0.0:10123”异常。

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

Module Module1
    Sub Main()
        Dim ep As New IPEndPoint(IPAddress.Loopback, 10123)
        Dim s As New Server(ep)
        Dim c As New Client(ep)
        Do
            Console.WriteLine("Waiting in main loop...")
            Thread.Sleep(5000)
        Loop
    End Sub
End Module

Public Class Server
    Private mBroadcaster As UdpClient

    Public Sub New(ep As IPEndPoint)
        mBroadcaster = New UdpClient
        mBroadcaster.ExclusiveAddressUse = False
        mBroadcaster.Connect(ep)
        Dim sender As New Thread(AddressOf SendLoop)
        sender.Start()
    End Sub

    Private Sub SendLoop()
        Do
            Dim msg As Byte() = Text.ASCIIEncoding.ASCII.GetBytes("Hello world")
            Console.WriteLine("Sending...")
            mBroadcaster.Send(msg, msg.Length)
            Thread.Sleep(1000)
        Loop
    End Sub
End Class

Public Class Client
    Private mListener As UdpClient

    Public Sub New(ep As IPEndPoint)
        mListener = New UdpClient
        mListener.ExclusiveAddressUse = False
        mListener.Connect(ep) 'Why can't I use IPAddress.Any here?
        Dim poller As New Thread(AddressOf PollLoop)
        poller.Start()
    End Sub

    Private Sub PollLoop()
        Do
            Dim ep As IPEndPoint = Nothing
            Console.WriteLine("  Receiver listening...")
            Dim incomingbytes As Byte() = mListener.Receive(ep)
            Dim msg As String = Text.ASCIIEncoding.ASCII.GetString(incomingbytes)
            Console.WriteLine("  Received: " & msg & " from " & ep.Address.ToString & ":" & ep.Port)
        Loop
    End Sub
End Class

共有1个答案

乐正心水
2023-03-14

我仍然不知道为什么原始代码不起作用,但我确实找到了一种方法来完成原始代码的意图。基本的想法是,显然可以为服务器使用Udp客户端,但不可以为…客户端使用Udp客户端。相反,我将Udp客户端更改为较低级别的Socket。我怀疑用Socket替换服务器的Udp客户端也可以,但我还没有测试过。这也解决了问题2(原始Socket允许侦听IP地址。任何)。

我仍然会接受一个不同的答案,这个答案实际上解释了为什么会这样。

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

Module Module1
    Sub Main()
        Dim s As New Server
        Dim c As New Client
        Do
            Console.WriteLine("Waiting in main loop...")
            Thread.Sleep(5000)
        Loop
    End Sub
End Module

Public Class Server
    Private mBroadcaster As UdpClient

    Public Sub New()
        mBroadcaster = New UdpClient
        mBroadcaster.ExclusiveAddressUse = False
        mBroadcaster.Connect(New IPEndPoint(IPAddress.Broadcast, 10123))
        Dim sender As New Thread(AddressOf SendLoop)
        sender.Start()
    End Sub

    Private Sub SendLoop()
        Do
            Dim msg As Byte() = Text.ASCIIEncoding.ASCII.GetBytes("Hello world")
            Console.WriteLine("Sending...")
            mBroadcaster.Send(msg, msg.Length)
            Thread.Sleep(1000)
        Loop
    End Sub
End Class

Public Class Client
    Private mListener As Socket

    Public Sub New()
        mListener = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
        mListener.ExclusiveAddressUse = False
        mListener.Bind(New IPEndPoint(IPAddress.Any, 10123))
        Dim poller As New Thread(AddressOf PollLoop)
        poller.Start()
    End Sub

    Private Sub PollLoop()
        Dim buffer As Byte() = New Byte(1023) {}
        Do
            Console.WriteLine("  Receiver listening...")
            Dim nbytes As Integer = mListener.Receive(buffer)
            Dim msg As String = Text.ASCIIEncoding.ASCII.GetString(buffer, 0, nbytes)
            Console.WriteLine("  Received: " & msg)
        Loop
    End Sub
End Class
 类似资料:
  • 根据Stevens(图示为TCP/IP),traceroute程序用增量TTL(1、2、3等)向目的主机发送UDP数据包,以从ICMP TTL过期消息中获取中间跳信息。 “到达目的地”条件是ICMP端口无法到达的消息,因为traceroute寻址的随机端口数量很高(也就是说,不太可能有人在那里监听) 所以我的问题是:是否有技术原因(缺点、RFCs等)使用UDP数据包而不使用例如ICMP回送请求消息

  • 所以,这可能是一个愚蠢的问题,但据我所知,如果我通过TCP或UDP发送数据,如果组成该TCP/UDP数据包的任何一个IP数据包被丢弃,整个TCP/UDP数据包将被重传,但我的问题是为什么我们不能只发送丢失的部分数据吗?目前,我对此的唯一推理是,如果我们要为收到的每个IP数据包发送确认字符,这将增加网络拥塞。这是正确的,还是有其他原因,当只有一个或几个IP数据包被丢弃时,我们必须重新发送TCP/UD

  • 问题内容: 我正在发送非常大的数据报(64000字节)。我意识到MTU远小于64000字节(根据我的阅读,典型值约为1500字节),但我怀疑会发生以下两种情况之一- 要么没有数据报都能通过(所有大于1500字节)会被静默丢弃或导致引发错误/异常),否则64000字节数据报将被分拆成大约43 1500字节消息并透明地传输。 从长远来看(2000+ 64000字节数据报),约有1%的数据报(甚至对于L

  • 我正在Cooja中运行一个模拟。我的模拟只有2个motos:一个rpl边界路由器,一个rpl udp-server。我使用的是Contiki中给出的示例代码:bord-router. c和udp-server. c。 我正在使用“tunslip6”工具在moto和我的本地机器(在Ubuntu 18.04上运行)之间建立一个桥梁。现在,我想访问rpl udp服务器moto,并希望从本地计算机获得回复

  • 问题内容: 我正在开发流服务器和Flash客户端之间的Java接口。我注意到即使两个进程都在本地运行,UDP数据报也可能无法按顺序到达我的接口。 那是正常的吗?我以为,由于数据报不必通过任何路由器或任何网络设备,因此这应该不会发生。 问题答案: 实际上,即使UDP数据包是由本地主机上的本地主机发送的,也无法保证其顺序和接收。仅仅因为协议的规范并不意味着它的任何含义。 由于无法对它们进行假设,因此应