PDA

View Full Version : حرفه ای: نحوه و چگونگی استفاده درست از دستور PING جهت مشاهده IPهای فعال در شبکه



davood59
سه شنبه 13 فروردین 1392, 21:22 عصر
سلام دوستان؛
امیدوارم امروز به همه شما خوش گذشته باشه.
یک سؤال از خدمتتون داشتم؛
فرض کنید من شبکه ای متشکل از 100 کلاینت دارم.
IP این کلاینتها از 192.168.100.1 شروع و به 192.168.100.200 ختم میشه.
میخوام برنامه ای بنویسم که پس از ساعات اداری اونو اجرا کنم و ببینم چه اشخاصی کلاینت خودشون رو خاموش نکردن و یا بعبارتی روشن مونده.

منطق برنامه این رو میگه که یه حلقه For بدین شکل ایجاد کنم:

for (int j = 1; j <= 200; j++)
{
//in this part we should check Ip('s) in range 192.168.100.j to Find Up or Down Ip('s)
}


حالا در داخل این حلقه باید یک به یک کلاینتها رو چک کنم و اگه پاسخی فرستادن یا همون IPStatus.Success از نظر منطقی true بود روی صفحه به من نمایش بده. (بعنوان مثال بگه 10 تا کلاینت با IP های نمایش داده شده فعال هستند).
با جستجویی که کردم دو تا کد رو بهتر و ساده تر از بقیه تشخیص دادم.(از این لینک (http://stackoverflow.com/questions/12620915/in-c-sharp-verify-the-ping-utility))
کد نخست:


using System.Net.NetworkInformation;

var ping = new Ping();
var reply = ping.Send("10.38.2.73", 60 * 1000); // 1 minute time out (in ms)
if (reply.Status == IPStatus.Success)
{
Console.WriteLine("Server is up");
}
else
{
Console.WriteLine("Server is down");
}


کد دوم:


Ping pingSender = new Ping();
byte[] data = Encoding.ASCII.GetBytes("test");
int timeout = 100;
PingReply reply = pingSender.Send("127.0.0.1", timeout, data);
if (reply.Status == IPStatus.Success)
{
Console.WriteLine("Address: {0}", reply.Address.ToString());
Console.WriteLine("RoundTrip time: {0}", reply.RoundtripTime);
Console.WriteLine("Time to live: {0}", reply.Options.Ttl);
}



حالا از شما دو تا راهنمایی میخواستم؛
اولا اگه ممکنه به طور خلاصه نحوه کار کدهای بالا رو برام به اختصار شرح بدید! (اینکه هر دستور دقیقاً چه عملی انجام میده!)
دوماً؛ با استفاده از کدهای فوق و یا مشابه؛ به چه نحوی برنامه ای که مد نظرم هست رو اجرایی کنم؟
از شما ممنون و سپاسگزارم.

hunter_ara
چهارشنبه 14 فروردین 1392, 01:01 صبح
سلام و سال نو مبارک

قطعه کد اول:

var ping = new Ping();
یک متغیر به نام ping از کلاس پینگ ساخته
var reply = ping.Send("10.38.2.73", 60 * 1000);
از تابع send همون کلاس استفاده کرده٬ (پارامتر اول IP و دومی TimeOut هست که چون به میلی ثانیه هست ۶۰ ثانیه را در ۱۰۰۰ ضرب کرده و نتیجه رو در متغیر دیگه ای به نام reply ریخته!
if (reply.Status == IPStatus.Success)
{
Console.WriteLine("Server is up");
}

اگر IP پینگ شده جواب داد به ما میگه و else هم در صورت جواب ندادن!

کد دوم هم مثل کد اول! فقط با این تفاوت که چیزی که برای پینگ فرستاده رو هم مشخص کرده که تا جایی که من میدونم اصلا مهم نیست چی باشه!

اینم کد انجام این کار:

using System;
using System.Net.NetworkInformation;

namespace PingTest
{
class Program
{
static void Main(string[] args)
{
string IpRange = "192.168.1.";
int ClientNum = 0;
while (ClientNum != 256)
{
string IP = string.Concat(IpRange,ClientNum.ToString());
if (Pinger(IP))
Console.WriteLine(IP+" is Online");
ClientNum++;
}
Console.WriteLine("END");
Console.ReadKey();
}

private static bool Pinger(string IpAdress)
{
Ping ping = new Ping();
PingReply reply = ping.Send(IpAdress, 50);
if (reply.Status == IPStatus.Success)
return true;
else
return false;
}
}
}