【发布时间】:2021-05-21 23:26:37
【问题描述】:
现在大约 8 小时以来,我一直在尝试找到一种方法,以便我可以接收与我在同一网络中的所有设备。我已经找到了一些方法来做到这一点,但所有这些方法都归结为 ping 网络中的所有 IP。如果 Unity 允许多线程,那将不是什么大问题。由于它不/基本上只允许 IEnumerator 我有一个问题,我必须一个接一个地执行每个 ping,这需要很多时间,你甚至不能使用 GUI。
我当前的代码如下所示:
public class AddressFinder {
private List<Ping> pingers = new List<Ping>();
private List<IPAddress> addresses = new List<IPAddress>();
private int timeOut = 250;
private int ttl = 5;
private int instances;
private MonoBehaviour m;
public void Scan(MonoBehaviour mono, IPSegment ips, Action<List<IPAddress>> callback) {
this.m = mono;
m.StartCoroutine(ScanAsync(ips, callback)); // New Coroutine so the UI should not freeze
}
private IEnumerator ScanAsync(IPSegment ips, Action<List<IPAddress>> callback) {
PingOptions po = new PingOptions(ttl, true);
byte[] data = new System.Text.ASCIIEncoding().GetBytes("abababababababababababababababab");
instances = 0;
foreach(uint host in ips.Hosts()) { // Itterate through all IPs in that network
m.StartCoroutine(Send(IPHelper.ToIpString(host) // IP as String, data, po));
}
WaitForSeconds wait = new WaitForSeconds(0.05f);
while(instances > 0) {
yield return wait;
}
callback(addresses);
}
private IEnumerator Send(string ip, byte[] data, PingOptions po) {
instances++;
Ping p = new Ping();
PingReply rep = p.Send(ip, timeOut, data, po);
p.Dispose();
if(rep.Status == IPStatus.Success)
addresses.Add(IPAddress.Parse(ip));
instances--;
yield return new WaitForSeconds(0);
}
}
这个 wcode 确实可以工作,但需要 4 分钟来测试我网络中的所有 253 个 IP。在此期间 UI 也会冻结。
我也尝试过使用统一 Ping,它看起来非常不一致,而且效果也不太好,因为它还需要很长时间才能获得 254 个 ping。
有没有人知道问题出在哪里或有其他想法让所有设备进入网络?
【问题讨论】:
-
我不知道c#中是否有好的方法,但是您可以创建一个c ++库并为统一创建一个包装器吗?我不确定这是否可行,但只是一个想法。统一内可能有更好的解决方案;)。
-
@nka_Zz 也在考虑库,但我无法想象 Unity 没有办法...特别是因为它可以在纯 c# 中轻松实现。问题只是由于某种原因统一不允许 Ping 的异步操作。
-
这有帮助吗? reddit.com/r/Unity3D/comments/6oui3f/multithreadingIncendiaryGames 的回答看起来很有帮助
-
我明天去看看我真的要睡觉了。但据我所知,它是关于多线程的。我的问题是,由于某种原因
new Ping().SendAsync(...确实冻结了团结;(
标签: c# unity3d networking