0

私は、Android デバイス (Android 4.2 を実行している Galaxy S2) を自動的に検出し、それとの通信を開始するプログラムを作成しようとしています。

アイデアは、ローカル ネットワークに接続されているすべてのデバイス (最大で 2 ~ 6 台のデバイス) にパケットを送信することであり、要求に応答する人が探している人です。最初に、考えられるすべてのローカル IP アドレスに対して ping を実行し、成功した ping にパケットを送信します。

C# からデバイスに ping を実行したときに問題が発生しました。コマンドラインから通常の方法でpingを実行しても問題ありませんが、コードでそれを行うと、おそらく30%の確率で機能し、残りの時間は11050応答を受け取ります(解読に成功していない魔女)

これは私のpingコードです:

    public static bool PingIt(string IP)
    {
        // Get an object that will block the main thread.
        AutoResetEvent waiter = new AutoResetEvent(false);
        Ping pingSender = new Ping();
        PingOptions options = new PingOptions();
        // Use the default Ttl value which is 128, 
        // but change the fragmentation behavior. 
        options.DontFragment = true;
        options.Ttl = 128;

        // When the PingCompleted event is raised,
        // the PingCompletedCallback method is called.
        pingSender.PingCompleted += new PingCompletedEventHandler(PingCompletedCallback);

        // Create a buffer of 32 bytes of data to be transmitted. 
        string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        byte[] buffer = Encoding.ASCII.GetBytes(data);
        int timeout = 5000;
        //PingReply reply = pingSender.Send(IP, timeout, buffer, options);

        try
        {
            pingSender.SendAsync(IP, timeout, buffer, options, waiter);
            //pingSender.SendAsync(IP, timeout, IP);
        }
        catch (PingException ex)
        {
            Console.WriteLine(ex.InnerException);
            return false;
        }

        return true;
    }

そしてコールバック:

    private static void PingCompletedCallback(object sender, PingCompletedEventArgs e)
    {
        // If the operation was canceled, display a message to the user.
        if (e.Cancelled)
        {
            Console.WriteLine("Ping canceled.");
            // Let the main thread resume. 
            // UserToken is the AutoResetEvent object that the main thread 
            // is waiting for.
            ((AutoResetEvent)e.UserState).Set();
        }
        // If an error occurred, display the exception to the user.
        if (e.Error != null)
        {
            Console.WriteLine("Ping failed:");
            Console.WriteLine(e.Error.ToString());
            // Let the main thread resume. 
            ((AutoResetEvent)e.UserState).Set();
        }

        PingReply reply = e.Reply;
        Console.WriteLine(reply.Address.ToString() + " " + reply.Status.ToString());

        // Let the main thread resume.
        ((AutoResetEvent)e.UserState).Set();

        lock(lockObj)
        {
            pingProgress++;

            //if (reply.Status == IPStatus.Success)
                //availableDevices.Add(reply.Address.ToString());
        }
    }

出力は ping の結果です。ファイアウォールもオフにしてみましたが、効果がありません。助言がありますか?

4

1 に答える 1