在Unity中通过Android Ping

时间:2019-02-27 16:45:24

标签: c# android unity3d ping

我目前正在尝试从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上 did 阻塞了,但在Android上却没有,并抛出了相同的异常:InvalidOperationException: No process is associated with this object.

SendAsync:

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。我只想知道地址是否可以到达,因此也很欢迎其他解决方案。

1 个答案:

答案 0 :(得分:0)

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