私は、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 の結果です。ファイアウォールもオフにしてみましたが、効果がありません。助言がありますか?