如何在 C# 中使用 Unity UNET 获取本地网络中所有设备的 IP 地址?

How to get IP addresses of all devices in local network with Unity UNET in C#?

各位!

我在一个本地网络中有很多设备。如何获取所有这些设备的 IP 地址?

我想做这样的事情:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Tools : MonoBehaviour {

    //get local ip address
    public string getIP() {

        string IP = "";

        IP = Network.player.ipAddress;

        return IP;
    }

    //get all ip addresses in local network
    public List<string> getIPArray() {

        List<string> listIP = new List<string>();


        return listIP;
    }
}

有两种方法可以做到这一点:

1.UDP

这是一个漫长的过程,但可以使用 UDP 完成。

1。首先要做的是获取本地 IP 地址。如果你的本地ip是192.168.1.13,你必须把最后一个八位位组13取出来替换成255

2。在所有游戏中启动 UDP 服务器并使用您想要的任何端口收听 IPAddress.Any。建议使用 >=9000 的端口。以下端口通常被其他一些应用程序使用。如果从客户那里收到任何东西,请将一些东西发回给客户,让客户知道您有空。

3。要搜索游戏,请创建一个 UDP 客户端并从 #1 向该 IP 地址发送内容,该地址以 255,然后听听IPAddress.Any,看有没有反应。如果从任何服务器接收到 response/message,则将接收消息的 IP 存储到数组或 List.

4。然后您可以使用 #3 中存储的 IP 来查找您网络上的所有可用设备。

Here 是一个工作示例。

不好的一面是,如果您有免费版的 Unity,它将无法工作。有一个限制要求您拥有 Unity Pro 才能使用来自 C# 的任何原始套接字 API。 对于 Unity 5[=64 不再适用=] 及以上。现在无需专业版许可即可在 Unity 5 及更高版本中使用。


2.NetworkDiscovery

好消息是 Unity 在 5.3 左右的版本中让您更容易做到这一点。我不记得是什么版本,但请确保拥有最新版本。您无需使用 Unity Pro 即可工作。

您可以在新版Unity中使用NetworkDiscovery class to do this。 只需调用 NetworkDiscovery.StartAsServer() 即可向客户端广播消息。在客户端,您可以通过调用NetworkDiscovery.StartAsClient()来收听广播。您可以使用 OnReceivedBroadcast(string fromAddress, string data); 查看您从哪个设备接收。再简单不过了。