统一时C#脚本上的UDP服务器启动但无法接收数据包

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了统一时C#脚本上的UDP服务器启动但无法接收数据包相关的知识,希望对你有一定的参考价值。

我的android手机上有一个应用程序,它发送一个带有一些信息的UDP数据包,我想把这个UDP数据包发送到我的Unity应用程序。 Android应用程序工作并发送UDP数据包(与wireshark检查)但不知何故我的C#脚本无法接收任何。我用Google搜索并查看了类似的问题,但没有一个给我一个答案。我真的不知道为什么它不能接受这个包。

我正在广播UDP数据包,以使事情更容易,但它似乎不起作用。我还检查了端口。

这是我的C#代码:

public class ControllerListener : MonoBehaviour
{
    Thread receiveThread;
    UdpClient client;

    public int port; 
    public string lastReceivedUDPPacket = "";
    public string allReceivedUDPPackets = "";

    public void Start()
    {
        init();
    }

    // OnGUI
    void OnGUI()
    {
        Rect rectObj = new Rect(40, 10, 200, 400);
        GUIStyle style = new GUIStyle();
        style.alignment = TextAnchor.UpperLeft;
        GUI.Box(rectObj, "# UDPReceive
127.0.0.1 " + port + " #
"
                    + "shell> nc -u 127.0.0.1 : " + port + " 
"
                    + "
Last Packet: 
" + lastReceivedUDPPacket
                    + "

All Messages: 
" + allReceivedUDPPackets
                , style);
    }

    public void Update()
    {

    }

    // init
    private void init()
    {
        print("UDPSend.init()");

        // define port
        port = 5678;

        // status
        print("Sending to 127.0.0.1 : " + port);
        print("Test-Sending to this Port: nc -u 127.0.0.1  " + port + "");

        receiveThread = new Thread(
            new ThreadStart(ReceiveData));
        receiveThread.IsBackground = true;
        receiveThread.Start();
    }

    // receive thread
    private void ReceiveData()
    {
        client = new UdpClient(port);
        while (true)
        {
            try
            {
                // Bytes empfangen.
                IPEndPoint anyIP = new IPEndPoint(IPAddress.Broadcast, 5678);
                byte[] data = client.Receive(ref anyIP);

                // Bytes mit der UTF8-Kodierung in das Textformat kodieren.
                string text = Encoding.UTF8.GetString(data);

                // Den abgerufenen Text anzeigen.
                print(">> " + text);
                // latest UDPpacket
                lastReceivedUDPPacket = text;
                Thread.Sleep(8);
                Debug.Log("Hier");
                // ....
                allReceivedUDPPackets = allReceivedUDPPackets + text;

            }
            catch (Exception err)
            {
                print(err.ToString());
            }
        }
    }

    // getLatestUDPPacket
    // cleans up the rest
    public string getLatestUDPPacket()
    {
        allReceivedUDPPackets = "";
        return lastReceivedUDPPacket;
    }

    void OnDisable()
    {
        if (receiveThread != null)
            receiveThread.Abort();

        client.Close();
    }
}

我只是想知道为什么我的代码不会从.Receive(...)方法中获取,即使广播了UDP数据包。

在此先感谢(我在本网站上的第一篇文章)

干杯

答案

Udpclient.Receive将阻塞,直到数据报从远程主机到达。

因此,如果它没有返回它只是意味着还没有收到任何东西。

这可能有多种原因。

你应该更喜欢使用IPEndPoint

IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0);

这意味着发件人可以拥有任何IP地址并从任何端口发送。您将发件人地址限制为Broadcast,由于发件人无法拥有广播地址,因此可能永远不会出现这种情况。发件人传出端口也可能与5678不匹配。 0允许发件人从任何端口发送。


旁注:Thread.Sleep是以毫秒为单位,因此仅使用8也看起来有点奇怪;)

以上是关于统一时C#脚本上的UDP服务器启动但无法接收数据包的主要内容,如果未能解决你的问题,请参考以下文章

erlang udp服务器无法接收接受数据包

Java UDP 客户端不接收数据包

C UDP组播接收丢包

c_cpp 此user_main.c应该能够使用SDK 1.0接收UDP广播数据包,但不能。

Unity 游戏内无法接收 UDP 数据包

游戏服务器应该如何接收具有定义滴答率的 udp 数据包?