我目前正在尝试从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上 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。我只想知道地址是否可以到达,因此也很欢迎其他解决方案。
答案 0 :(得分:0)
在商业项目中,我们通常将带有timeStamp的消息通过TCP套接字发送到服务器,然后从服务器接收消息,在这种情况下ping =(Server_timeStamp-Client_timeStamp)。