【问题标题】:How to get information from a remote UDP socket? C# & IPv4如何从远程 UDP 套接字获取信息? C# & IPv4
【发布时间】:2022-01-25 07:05:03
【问题描述】:

我的硬件以大约 5 秒的间隔向地址 192.168.0.255 发送信息(在下图中,Wireshark 软件显示 IP 地址为 192.168.0.241 的设备发送消息“你好”到端口 7000 上的地址 192.168.0.255):

另一方面,我有一个用 C# 制作的桌面应用程序,它尝试按如下方式读取该信息:

int PORT = 7000;
udpClient = new UdpClient();
udpClient.Client.Bind(new IPEndPoint(IPAddress.Any, PORT));


private async Task<string> getData()
{
   try
   {
        var from = new IPEndPoint(0, 0);
        while (true)
        {
           var recvBuffer = udpClient.Receive(ref from);
           string result= Encoding.UTF8.GetString(recvBuffer);
           if (result != null && resultado.Length > 0)
           {
               return result;
           }
        }
   }
   ...
}

它不起作用(udpClient.Receive 永远不会返回信息,这类似于还没有套接字信息),但是如果我从我的 PC 上打开一个允许我将信息写入 UDP scoket 的软件工具,该代码运行良好(udpClient.Receive 捕获发送的信息。)

有什么建议吗?

【问题讨论】:

  • 具体是什么意思不起作用?它会引发异常还是卡在Receive 调用上?您是否尝试过调试它?我们在这里需要更多信息;-)
  • 我的意思是断点永远不会到达,如第二张图片所示,因为它类似于在提到的套接字中找不到信息。
  • 您是否尝试过验证(例如通过使用 WireShark)是否有任何数据从您的设备发送到电脑?
  • 抱歉,有一些问题,没有看到图片。好的,如果您使用的是桌面应用程序,它是从本地机器发送的,还是您也尝试过另一台机器?可能是您有一些防火墙问题阻止了 udp 流量。由于 localhost 通常不会被阻止,但它可能在您的本地计算机上工作。
  • 很高兴听到它对你有用 ;-) 据我所知,wireshark 设法在防火墙启动之前捕获数据,所以你可能会遇到问题。

标签: c# networking tcp udp udpclient


【解决方案1】:
    UdpClient client;
    IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, PORT);

private void Connect()
{
    client = new UdpClient(7000);
    client.Connect(endPoint);
    client.BeginReceive(ReceiveCallback, null);
}

    private void ReceiveCallback(IAsyncResult _result)
    {
        try
        {
            byte[] _data = client.EndReceive(_result, ref endPoint);
            socket.BeginReceive(ReceiveCallback, null);

            if (_data.Length < 4)
            {
                //disconnected
                return;
            }
    //now data is anything received and if you want to view it as a string do:
    string result = Encoding.Default.GetString(data);
    //you can also convert it to other things like ints, float, etc
        }
        catch
        {
            //disconnected
        }
    }

【讨论】:

  • 该代码不完整且正在纠正,它没有从 UDP 套接字捕获任何数据
【解决方案2】:

感谢@MarkusSafar 的建议,我将桌面应用程序放在另一台 PC 上,并从那里设法捕获硬件消息。我不确定为什么它不能在我的 PC 上运行,但下一步是为 Android (Xamarin) 开发的应用测试相同的代码,我希望它也能在那里运行。

【讨论】:

    猜你喜欢
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 2017-09-04
    相关资源
    最近更新 更多