c# - 在Unity3D中无法接收来自PLC的C#UDP消息,但在Wireshark中可见

标签 c# sockets unity3d udp wireshark

我有一个通过以太网电缆直接连接到运行Unity3d的Win10笔记本电脑的PLC。我的目标是使用UDP连接将数据从PLC发送到Unity模型。

当前,PLC每秒钟发送一次消息,它们在Wireshark中可见。

Unity一半运行着一个Receive-Thread。它可以通过本地127.0.0.1 IP连接接收。我还在Unity中实现了一个发件人来进行测试,它可以按预期工作。

不起作用的是从PLC接收指向与内部连接相同端口的消息。

到目前为止,我...

  • ...将以太网端口设置为静态IP(192.168.0.41)
  • ...在防火墙中打开了用于UDP通信的端口,这应该不是问题。
  • ...更改了接收端口(当前设置为8052)
  • ...尝试了客户端设置的变体,没有任何变化。
  • ...通过不同的线程和注释部分进行了研究和挖掘,但没有成功。尽管我发现其他人也遇到了同样的问题,但是没有人发布答案。

  • Unity3d C#接收代码(缩短为相关部分):
    private void init()
    {
       port = 8052;
    
            receiveThread = new Thread( new ThreadStart(ReceiveData));
            receiveThread.IsBackground = true;
            receiveThread.Start();
        }
    
        private void ReceiveData()
        {
            // create a client
            client = new UdpClient(port);
            while (true)
            {
                // if an Error occours the program doesn't crash
                try
                {
                    // Create connection point and receiving client + receiving bytes
                    IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, port);
                    byte[] data = client.Receive(ref anyIP);
    
                    print("Number of bytes: " + data.Length.ToString());
    
                    /*
                     * use the received data
                     */
    
                }
                catch (Exception err)
                {
                    //Output if receiving experienced an error
                    print(err.ToString());
                }
            }
        }
    }
    

    我认为可能是问题所在:
  • 在我尚未考虑的防火墙旁边,还有另一层可以阻止连接
  • 客户端设置需要不同才能从外部来源接收消息。
  • 需要异步UDP客户端

  • (接收)代码基于:
    Simple UDP implementation

    另一个问题,因为我刚接触网络,所以:如果Wireshark可以看到该软件包,它是否应该已经超过防火墙和其他可能的阻挡层?还是Wireshark正在寻找更低的通信层?

    先感谢您!

    Wireshark的屏幕截图:
    Multiple incoming messages
    Details of one message

    最佳答案

    因此,在经历了一段非常令人沮丧的旅程之后,我发现了一个不好的解决方法,但却可以完成工作:

    我编写了一个python脚本,该脚本打开一个套接字,接收外部数据,并通过本地IP将其转发到Unity。那行得通。

    这是代码:

    # Import libraies
    import socket
    import time
    
    # Set send IP adress and port
    UDP_IP = "127.0.0.1"
    UDP_PORT_Rec = 8052
    UDP_PORT_Unity = 8055
    
    print("Receiving on Port:" + str(UDP_PORT_Rec))
    print("Sending to IP:" + UDP_IP + ":" + str(UDP_PORT_Unity))
    
    # Set socket to send udp messages and bind port
    sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    sock.bind(('',UDP_PORT_Rec));
    
    ## Keep sending message from file location
    while True:
        data, addr = sock.recvfrom(1024) #buffer size, hopefully no problem if too big
        print("Received")
    
        sock.sendto(data, (UDP_IP, UDP_PORT_Unity))
        print("Send")
    

    可用于解决问题的工具:
  • 安装Wireshark!它可能是跟踪Internet流量的最佳工具。在Wireshark中可见的软件包对于正常应用程序可能不可见!
  • 使用Packet Sender生成和接收流量。该应用程序使用一种基本的方法来接收软件包-如果可以的话,您的程序也应该可以。
  • 使用netstat -aon检查套接字是否正在运行。
  • 完成:检查您的防火墙设置。

  • 感谢Trevor和Programmer的帮助。

    关于c# - 在Unity3D中无法接收来自PLC的C#UDP消息,但在Wireshark中可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50470502/

    相关文章:

    java - 如何编写java程序来启动远程机器上的程序?

    unity3d - FPS 的角色 Controller 与刚体

    opengl - 带有 Oculus Rift 的原生渲染插件

    c# - .net core 中项目之间的身份验证

    c# - 如何将多个 c# 类包含到同一个 ListView uwp

    c# - 如何将数据表分组为单行数据

    c# - 我们怎样才能得到照片的评论

    调用 ioctl() 会导致 errno 指示 "Bad address"

    java - ServerSocket.accept() 抛出 SocketTimeoutException 并显示 null 消息

    ios - Unity3D iOS 导出错误-调用 'objc_msgSendSuper' 没有匹配函数