【发布时间】:2019-02-27 16:45:24
【问题描述】:
我目前正在尝试从我的 Unity 应用程序 ping 另一台设备。我已经尝试过UnityEngine.Ping 和System.Net.Networkinformation.Ping,但在 Android 上都不能正常工作。如果目标不在同一个网络中,UnityEngine.Ping 在 Windows 上已经失败(我从我自己的 PC 和另一台在以太网中的 PC 得到响应,但不是从我在 wifi 上的手机)。如果我在 Windows 上使用System.Net.Networkinformation.Ping,我确实会收到电话的回复。
在 Adroid 上,每个都有不同的问题:
UnityEngine.Ping:也不例外,但是Ping在一秒钟后报告isDone,但是time属性是-1(表示还没有响应)。 timeout 设置为 45 秒,只是为了确定。
UnityEngine.Ping ping = new UnityEngine.Ping(remoteIP);
float timer = 0;
while (timer <= timeout && !ping.isDone) {
timer += Time.deltaTime;
yield return null;
}
if (ping.time < 0 || ping.time >= timeout) {
//do failure stuff
} else {
//do success stuff
}
ping.DestroyPing();
System.Net.Networkinfo.Ping:我尝试了Send 和SendAsync。前者抛出InvalidOperationException,后者立即调用PingCompleted回调并抛出NullReferenceException。两个版本都可以在 Windows 上完美运行。
发送:
Thread pingThread = new Thread(() => {
using (System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping()) {
PingReply reply = ping.Send(remoteIP, Mathf.RoundToInt(timeout * 1000));
if (reply?.Status == IPStatus.Success) {
//do success stuff
} else {
//do failure stuff
}
}
});
pingThread.Start();
(我也尝试在主线程上调用它。它确实在 Windows 上阻塞,但在 Android 上没有,并抛出相同的异常:InvalidOperationException: No process is associated with this object.)
发送异步:
using (System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping()) {
ping.PingCompleted += (sender, args) => {
if (args.Reply.Status == IPStatus.Success) {
//do success stuff
} else {
//do failure stuff
}
};
ping.SendAsync(remoteIP, Mathf.RoundToInt(timeout * 1000));
}
NullRefereneException 被扔到if (args.Reply.Status == IPStatus.Success) { 行中。
这里有人可以告诉我我做错了什么吗?或者我还能尝试什么?
编辑:不一定是实际的 ICMP ping。我只需要知道地址是否可达,因此也非常欢迎替代解决方案。
【问题讨论】:
-
你有必要的权限吗?
-
我是否需要额外的权限才能进行 ping?我已经(成功)在同一个应用程序中打开了 TCP 和 UDP 连接。