pingを送信する(非同期)

pingを非同期で送信するサンプルです。

Formにホスト名入力テキストボックスと
ping送信、停止ボタンと
結果を表示するテキストボックスを
それぞれ配置しています。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace PingTest
{
    public partial class Form1 : Form
    {
        System.Net.NetworkInformation.Ping _ping = new System.Net.NetworkInformation.Ping();

        bool _bSending = false;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            _ping.PingCompleted += new System.Net.NetworkInformation.PingCompletedEventHandler(_ping_PingCompleted);
        }

        private void buttonStartStop_Click(object sender, EventArgs e)
        {
            buttonStartStop.Enabled = false;

            if(!_bSending)
            {
                _bSending = true;

                // Ping設定: TTL=64,データは断片化されないよう指定
                System.Net.NetworkInformation.PingOptions pingOption =
                    new System.Net.NetworkInformation.PingOptions(64, true);

                // Pingで送信するデータ
                byte[] buffer = System.Text.Encoding.ASCII.GetBytes("ping test data");
            
                // Ping送信:タイムアウト10秒
                _ping.SendAsync(textBoxHostName.Text, 10000, buffer, pingOption, null);
            }
            else
            {
                _bSending = false;

                _ping.SendAsyncCancel();
            }
        }

        void _ping_PingCompleted(object sender, System.Net.NetworkInformation.PingCompletedEventArgs e)
        {
            if(e.Cancelled)
            {
                MessageBox.Show("キャンセルされました。");
                return;
            }

            string msg;

            if(e.Error != null)
            {
                msg = e.Error.Message;
            }
            else
            {
                // 返答あり?
                if(e.Reply.Status == System.Net.NetworkInformation.IPStatus.Success)
                {
                    msg = string.Format(
                        "{0} からの応答: バイト数 ={1} 時間 ={2}ms TTL={3}",
                        e.Reply.Address,
                        e.Reply.Buffer.Length,
                        e.Reply.RoundtripTime,
                        e.Reply.Options.Ttl);
                }
                else
                {
                    msg = string.Format("Ping失敗 {0}", e.Reply.Status);
                }
            }

            textBoxLog.AppendText(msg + "\r\n");

            _bSending = false;

            buttonStartStop.Enabled = true;
        }
    }
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)