c#即使没有网络,也使用Ping.send或sendAsync

时间:2017-06-30 11:50:21

标签: c# android unity3d

我很长时间都在努力解决问题。我使用统一,我想ping我的服务器和路由器。我在开始时使用UnityPing类,它适用于大多数设备,但是当我在Google Pixel(Android 7.1)上测试时,它总是返回-1。所以我尝试使用System.Net.NetworkInformation来ping我的服务器。这是我的代码:

private void PingToServer()
{
    AutoResetEvent waiter = new AutoResetEvent(false);
    System.Net.NetworkInformation.Ping pingSender = new System.Net.NetworkInformation.Ping();
    pingSender.PingCompleted += new PingCompletedEventHandler(PingCompletedCallback);
    string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
    byte[] buffer = Encoding.ASCII.GetBytes(data);
    int timeout = 10000;
    PingOptions options = new PingOptions(64, true);
    IPAddress address = IPAddress.Parse("119.81.194.57");
    pingSender.SendAsync(address, timeout, buffer, options, waiter);
}
private void PingCompletedCallback(object sender, PingCompletedEventArgs e)
{
    if (e.Cancelled)
    {
        Console.WriteLine("Ping canceled.");
        ((AutoResetEvent)e.UserState).Set();
    }
    if (e.Error != null)
    {
        Console.WriteLine("Ping failed:");
        Console.WriteLine(e.Error.ToString());
        ((AutoResetEvent)e.UserState).Set();
    }
    PingReply reply = e.Reply;
    int pingTime = (int)reply.RoundtripTime;
    UnityEngine.Debug.Log(reply.RoundtripTime);
    ((AutoResetEvent)e.UserState).Set();
}

并且它总是返回一个RoundripTime,这似乎是一个有意义的数字,但当我尝试ping另一个无法访问甚至关闭互联网的IP地址时,它总是返回一个RoundripTime,其中reply.status等于IPStatus 。成功。现在我很困惑,我是否真的ping了我的远程服务器?

我确实解决了其他一些类似的问题,但它并没有解决问题。一些答案建议使用SendPingAsync而不是SendAsync,但这对于统一来说是不可能的。

1 个答案:

答案 0 :(得分:0)

我有button.click事件,我有这个代码......它工作正常

    AutoResetEvent waiter = new AutoResetEvent(false);
    Ping pingSender = new Ping();
    string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
    byte[] buffer = Encoding.ASCII.GetBytes(data);
    int timeout = 100;
    PingOptions options = new PingOptions(64, true);
    IPAddress address = IPAddress.Parse("YourTestIP");
    PingReply reply = pingSender.Send(address, timeout, buffer, options);
    if (reply.Status == IPStatus.Success)
    {
        MessageBox.Show(reply.Address.ToString());
    }