Wednesday, May 9, 2012

C# Source Code Ping IP

มื่อสักต้นปีที่ผ่านมาผมได้เขียนโปรแกรมสำหรับควบคุม Printer Server อยู่โปรเจคต์หนึ่งและพบปัญหาว่าเมื่อโปรแกรมเราออนไลน์อยู่แล้วมีรายการสั่งพิมพิ์แต่เครื่องพิมพิ์ดันไม่ได้เปิดอยู่ อาจด้วยความสับเพร่าของพนักงานเอง แต่อย่างไรโปรแกรมเมอร์ก็โดนด่าอยู่ดีนั่นก็เป็นที่มาของการหาทางแก้ปัญหากัน ผมก็เลือกใช้วิธีการตรวจสอบ IP ของ Printer ก่อนว่าพร้อมทำงานไหม จะได้แสดงข้อความแจ้งให้ผู้ใช้ทราบก่อนว่า เฮ้ ปริ๊นเตอร์คุณไม่ได้เปิด อะไรประมาณนี้ และนี่ก็เป็นที่มาของโปรเจคทดสอบนี้ครับ
๑. เริ่มต้นด้วยการวาด Control ลงบนฟอร์ม
ผมได้ใช้ โปรแกรม SharpDevelop 3.2.0 Build: 5505  เพื่อเป็น IDE ในการเขียนนะครับ โดยผมได้เลือก Control ง่ายๆ ครับ textBox1, listBox1, button1, button2 ตามภาพด้านล่างนี้
Ping ip test running..
๒. ขั้นตอนการทำงานของโปรแกรม
เริ่มจากป้อน ip address ลงไปยัง textbox หลังจากนั้น click ที่ปุ่ม Ping แล้วโปรแกรมก็จะไปมองหา Ip ดังกล่าวในเน็ตเวิร์ค และก็แสดงผมลัพธ์ หลักการก็มีเท่านี้
๓. มาดู Source Code ของโปรแกรม
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
 * Created by SharpDevelop.
 * User: Yuth
 * Date: 26/3/2553
 * Time: 9:55
 *
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Text;
using System.Net;
using System.Net.NetworkInformation;
using System.ComponentModel;
using System.Threading;
 
namespace PingIP_Sample
{
    /// <summary>
    /// Description of MainForm.
    /// </summary>
    public partial class MainForm : Form
    {
        public MainForm()
        {
            //
            // The InitializeComponent() call is required for Windows Forms designer support.
            //
            InitializeComponent();
 
            //
            // TODO: Add constructor code after the InitializeComponent() call.
            //
        }
 
        void Button2Click(object sender, EventArgs e)
        {
            this.Close();
        }
 
        void Button1Click(object sender, EventArgs e)
        {
          if (textBox1.Text.Length == 0)
                MessageBox.Show("Ping needs a host or IP Address.");
 
            string who = textBox1.Text;
            AutoResetEvent waiter = new AutoResetEvent (false);
 
            Ping pingSender = new Ping ();
 
            // 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);
 
            // Wait 12 seconds for a reply.
            int timeout = 12000;
 
            // Set options for transmission:
            // The data can go through 64 gateways or routers
            // before it is destroyed, and the data packet
            // cannot be fragmented.
            PingOptions options = new PingOptions (64, true);
 
            listBox1.Items.Add("Time to live:" + options.Ttl.ToString());
            listBox1.Items.Add("Don't fragment:" + options.DontFragment.ToString());
 
            // Send the ping asynchronously.
            // Use the waiter as the user token.
            // When the callback completes, it can wake up this thread.
            pingSender.SendAsync(who, timeout, buffer, options, waiter);
 
            // Prevent this example application from ending.
            // A real application should do something useful
            // when possible.
           // waiter.WaitOne ();
            listBox1.Items.Add("Ping example completed.");
        }
 
       private void PingCompletedCallback (object sender, PingCompletedEventArgs e)
        {
            // If the operation was canceled, display a message to the user.
            if (e.Cancelled)
            {
                listBox1.Items.Add("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)
            {
                listBox1.Items.Add("Ping failed:");
                listBox1.Items.Add(e.Error.ToString ());
 
                // Let the main thread resume.
                ((AutoResetEvent)e.UserState).Set();
            }
 
            PingReply reply = e.Reply;
 
            DisplayReply (reply);
 
            // Let the main thread resume.
            ((AutoResetEvent)e.UserState).Set();
        }
 
       public void DisplayReply (PingReply reply)
        {
            if (reply == null)
                return;
 
            listBox1.Items.Add("ping status:"+ reply.Status.ToString());
            if (reply.Status == IPStatus.Success)
            {
                listBox1.Items.Add("Address:"+ reply.Address.ToString ());
                listBox1.Items.Add("RoundTrip time:"+ reply.RoundtripTime.ToString());
                listBox1.Items.Add("Time to live:"+ reply.Options.Ttl.ToString());
                listBox1.Items.Add("Don't fragment:"+  reply.Options.DontFragment.ToString());
                listBox1.Items.Add("Buffer size:"+ reply.Buffer.Length).ToString();
            }
        }
    }
}
Download Ping IP Example project
ผมได้ Upload ตัวอย่างโปรแกรมไว้ตามลิงค์นี้ครับ : http://www.codemarts.com/Downloads/PingIP_Sample.rar
อย่างไรก็ลองนำไปประยุกต์ใช้นะครับผมว่ามีประโยชน์แน่นอนถ้าคุณเขียนโปรแกรมที่รันบนระบบเครือข่าย

No comments:

Post a Comment