- PR -

C#でのPing実装

1
投稿者投稿内容
ゆいたん
ベテラン
会議室デビュー日: 2004/08/26
投稿数: 91
投稿日時: 2006-01-12 13:59
開発環境 C# 2005

http://ukamen.hp.infoseek.co.jp/Programming1/WinPing/
を参考にPingのプログラムを作っています。

変更点として、上記URLの場合ですと戻り値として情報(string)を返すように
なっていますが、うまく行かなかった場合、Exceptionをthrowするように
しました。

コード:
    try
    {
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);

	// [中略]

        IAsyncResult ar = socket.BeginReceiveFrom(ReceiveBuffer, 0, 256, SocketFlags.None, ref epSrc, null, null);
        bool result = ar.AsyncWaitHandle.WaitOne(1000, false);

        if (result)
        {
            nBytes = socket.EndReceiveFrom(ar, ref epSrc);
        }
        else
        {
            throw new CustomPingException("TIME_OUT");
        }
    }
    finally
    {
        socket.Close();
    }



実行自体はうまく行くのですが、result=trueの場合でもping自体は通ってない
場合(相手のIPアドレスがネットワーク上にない場合)があります。
VS2005で1度目にresult=true(ただし、IPは存在しない)でブレークして
ステップオーバーをし、もう一度メソッドを投げるとresult=falseで
例外がthrowされます。

このような状況からresult=trueの場合に何らかの判断が必要なのだと思うのですが
何が必要なのでしょうか?

何か手がかりをいただければと思います。よろしくお願いいたします。

以上
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-01-12 14:15
VS2005を使ってるならSystem.Net.NetworkInformation.Pingを使ってみては?
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-01-12 14:16
ICMPの仕様は理解されていますか?あなたの参考にしたサンプルコードは、応答データの受信処理を端折っているようです。

受信したデータのTYPEやCODE、シーケンス番号、IDをチェックして送信したECHO REQUESTに対するECHO REPLAYなのか判断する必要があります。今回の場合はルーターが返したエラー応答を受信しているのでしょう。おそらくTYPEがdestination unreachableになっていると思います。

#ってVS2005だったのか、Ping自作する必要ないじゃん orz

[ メッセージ編集済み 編集者: 甕星 編集日時 2006-01-12 14:32 ]
ゆいたん
ベテラン
会議室デビュー日: 2004/08/26
投稿数: 91
投稿日時: 2006-01-12 17:28
どっとねっとふぁんさん、甕星さんありがとうございます。
Pingクラスを使用して希望の処理ができるようになりました。

引用:

VS2005を使ってるならSystem.Net.NetworkInformation.Pingを使ってみては?


引用:

#ってVS2005だったのか、Ping自作する必要ないじゃん orz



C#、Pingでぐぐったら参考にしたページが出てきまして、あぁ、こうやるんだな
と漠然とやってしまいました。お手を煩わせまして、すみませんでした。

引用:

ICMPの仕様は理解されていますか?あなたの参考にしたサンプルコードは、応答データの受信処理を端折っているようです。



http://www.atmarkit.co.jp/fwin2k/network/baswinlan012/baswinlan012_02.html
を参考にReceiveBufferのByte配列を評価すればいいとは思うのですが、
自信がなかったもので。

以上
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2006-01-13 18:21
引用:

どっとねっとふぁんさんの書き込み (2006-01-12 14:15) より:
VS2005を使ってるならSystem.Net.NetworkInformation.Pingを使ってみては?


そんなクラスが追加されたんですね…。
#自作ライブラリの Framework 2.0 対応作業中ですが、また一つ、Obsolete 属性付ける必要が…。
1

スキルアップ/キャリアアップ(JOB@IT)