【问题标题】:Ping on Android in Unity在 Unity 中对 Android 进行 Ping
【发布时间】:2019-02-27 16:45:24
【问题描述】:

我目前正在尝试从我的 Unity 应用程序 ping 另一台设备。我已经尝试过UnityEngine.PingSystem.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:我尝试了SendSendAsync。前者抛出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 连接。

标签: c# android unity3d ping


【解决方案1】:

在商业项目中,我们通常通过 TCP 套接字向服务器发送带有时间戳的消息,然后从服务器接收消息,在这种情况下 ping = (Server_timeStamp - Client_timeStamp)。

【讨论】:

  • 我不想 ping 一个运行我们软件的特定服务器,我希望能够 ping 任意设备。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多