PDA

View Full Version : بدست آوردن لیست IP



saman_h
جمعه 26 خرداد 1391, 10:46 صبح
سلام دوستان
من چطوری میتونم لیست کسایی که توی یه رنج آی پی هستند رو توی یک ComboBox قرار بدم ؟
نمیخوام از dll و توابع ویندوز استفاده کنم
ممنون میشم کمک کنید

Saeed_m_Farid
جمعه 26 خرداد 1391, 13:20 عصر
سلام
نمیدونم راه بهتری هست یا نه ولی این کلاس یه رنج 255 تایی از ipBase ای که بهش داده میشه رو پینگ میکنه و چون من برای شبکه LANمون ازش استفاده میکنم، میدونم که هر پینگ بیشتر از 100 ms وقت نمیبره و اگه تو این مدت پینگ نشه یعنی یا هاست(node متصل به LAN) نیست یا deactive هست؛ شما میتونین برای کاربرد خودتون بیشتر یا کمترش کنین، shouldResolveNames هم برای اینه که اطلاعات کامل در مورد هاست اضافه بشه یا فقط IP کافیه:
class IPFetch
{
static CountdownEvent countdown;
private bool resolveNames = true;
public static bool Completed = false;
public static List<string> Result;

public static void StartFetch(ipBase = "192.168.1.",
bool shouldResolveNames = true,
int replyTime = 100)
{
countdown = new CountdownEvent(1);
Completed = false;
Result = new List<string>();
resolveNames = shouldResolveNames;
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 1; i < 255; i++)
{
string ip = ipBase + i.ToString();

Ping p = new Ping();
p.PingCompleted +=
new PingCompletedEventHandler(p_PingCompleted);
countdown.AddCount();
p.SendAsync(ip, replyTime, ip);
}
countdown.Signal();
countdown.Wait();
sw.Stop();
TimeSpan span = new TimeSpan(sw.ElapsedTicks);
Completed = true;
// Fetch time = sw.ElapsedMilliseconds
}

private static void p_PingCompleted(object sender, PingCompletedEventArgs e)
{
string ip = (string)e.UserState;
if (e.Reply != null && e.Reply.Status == IPStatus.Success)
{
if (resolveNames)
{
string name;
try
{
IPHostEntry hostEntry = Dns.GetHostEntry(ip);
name = hostEntry.HostName;
}
catch (SocketException ex)
{
name = ip;
}
Result.Add(String.Format("{0} ({1}) is up: ({2} ms)",
ip,
name,
e.Reply.RoundtripTime));
}
else
Result.Add(ip);
}
else if (e.Reply == null)
Result.Add("Pinging [" + ip + "] failed. (Null Reply object?)");
countdown.Signal();
}
}

نحوه استفاده اش هم که مشخصه ولی یه توضیح بدم که اگه replyTime رو دست نزنین، با فراخوانی StartFetch بعد کمتر از نیم ثانیه Completed مقدارش true میشه و شما می تونید Result رو استفاده کنید؛ ولی چون ممکنه پکت لاست شبکه بالا باشه و شما مقدار replyTimeرو عوض کنید، در اینحالت بهتره بعد فراخوانی StartFetch منتظر true شدن Completed بشین و بعدش Result رو به combo تون انتساب بدین، مثلاً اینطوری (همزمانی، خروج از حلقه بینهایت، قفل شدن فرم و ... دیگه با خودتون) :
IPFetch.StartFetch("172.16.99.", false, 1200);
while(!IPFetch.Completed)
Thread.Sleep(100);
comboBox1.Items.Add(IPFetch.Result);

=============
اینجا رو هم می تونید ببینید، از IPNetwork (http://ipnetwork.codeplex.com/) استفاده کرده: List IP all addresses in a subnet (http://stackoverflow.com/questions/3219762/list-ip-all-addresses-in-a-subnet)

saman_h
جمعه 26 خرداد 1391, 14:15 عصر
دوستان اگه کسی پیشنهادی یا راه دیگه ای داره ممنون میشم ذکر کنه .
فقط گفتم شاید یکم بیشتر توضیخ بدم بهتر باشه . اینو واسه نرم افزار چت که دارم مینویسم میخوام . میخوام موقع لود شدن IP هرکی که نرم افزارش باز هس رو توی یه Combobox اضافه کنه
با تشکر

Saeed_m_Farid
شنبه 27 خرداد 1391, 20:11 عصر
اساتییییییییییییییییییییی یید کجان پس ؟!
اساتید خیلی وقته نیستن، باید به همین ماها قناعت کنی! :لبخند:
عنوان تاپیک با چیزی که این اواخر مطرح کردین از زمین تا آسمون فرق میکنه! :
میخوام موقع لود شدن IP هرکی که نرم افزارش باز هس رو توی یه Combobox اضافه کنهشما کارهایی که تا اینجا انجام دادین رو بگین، تا ما (فعلاً که فقط من!) هم بهتر راهنمایی کنیم؛ برای اینکار کافیه تو برنامه کلاینت تون یه متد Alive بذارین که هروقت برنامه سمت هرکی run شد، به سرور شما اعلام کنه و شما هم به لیست تون اضافه اش کنید، کلاً فکر نکنم سمت سرور و کلاینت بیشتر از 5 خط کد بشه ولی باید یه حرکاتی مبنی بر برنامه نویس بودن شما در این تاپیک رویت بشه تا من بتونم ادامه بدم، مگه اینکه اساتید به دادتون برسن و شما رو از دست بنده نجات بدن ...

saman_h
یک شنبه 28 خرداد 1391, 13:34 عصر
اساتید خیلی وقته نیستن، باید به همین ماها قناعت کنی! :لبخند:
عنوان تاپیک با چیزی که این اواخر مطرح کردین از زمین تا آسمون فرق میکنه! : شما کارهایی که تا اینجا انجام دادین رو بگین، تا ما (فعلاً که فقط من!) هم بهتر راهنمایی کنیم؛ برای اینکار کافیه تو برنامه کلاینت تون یه متد Alive بذارین که هروقت برنامه سمت هرکی run شد، به سرور شما اعلام کنه و شما هم به لیست تون اضافه اش کنید، کلاً فکر نکنم سمت سرور و کلاینت بیشتر از 5 خط کد بشه ولی باید یه حرکاتی مبنی بر برنامه نویس بودن شما در این تاپیک رویت بشه تا من بتونم ادامه بدم، مگه اینکه اساتید به دادتون برسن و شما رو از دست بنده نجات بدن ...

والا کارهای زیادی که انجام دادم !!! برنامم تمومه حدودا فقط ریزکاری هاش مونده . میخواستم کاری کنم که هرکی برنامه رو اجرا میکنه توی لیست بقیه اضافه بشه که راحت بتونن به همدیگه کانکت بشن . حالا نمیدونم باید چی بگم که مبنی بر برنامه نویس بودنم باشه !! درضمن اضافه کنم که من برنامه Client / Server رو جداگانه نساختم !! یعنی یدونه برنامه ساختم که هم Client هست و هم Server
ممنون میشم راهنمایی کنید ...
با تشکر

Saeed_m_Farid
یک شنبه 28 خرداد 1391, 14:11 عصر
حالا نمیدونم باید چی بگم که مبنی بر برنامه نویس بودنم باشه !!
«دو صد گفته چون نیم کردار نیست»
کافیه قسمتی از کد رو که بین کلاینت و سرور تعامل دارید(حالا یک برنامه یا صدتا؛ مهم قسمت ارتباطی هست)، اینجا بذارین تا ما تکمیلش کنیم، بعنوان مثال تو رویداد OnAccept فلان کد رو نوشتم و در OnDataReceived این رو و ... حالا مشکلم فلان چیز هست؛ بدون یک قطعه کد چه سولوشنی میشه داد؟ منِ پاسخ دهنده، چه بدونم مکانیزم پردازش داده ها سمت سرور شما چی هست یا چطوری سمت کلاینت درخواست هاتون رو به اطلاع سرویس دهنده میرسونید؟ و ...
ضمناً بنده راه حل رو قدم به قدم خدمت تون عرض کردم، شما بگو کجاش مشکل داری! "یعنی کسی راه حل دیگه ای نداره ؟!" دردی دوا نمیکنه...

saman_h
یک شنبه 28 خرداد 1391, 14:40 عصر
دارم یه برنامه چت مینویسم با استفاده از Socket و پروتوکل TCP/IP
کارهای که انام دادم اینه که برنامه سمت سرور و کلاینتم رو تلفیق کردم پس در نتیجه یدونه برنامه بیشتر ندارم ... ! من این برنامه رو روی دوتا کامپیوتر اجرا میکنم . خوب حالا کافیه با یکی از برنامه ها به اونیکی دیگه وصل بشم . حالا چطوری ؟! اینطور که IP هر دو سیستم رو میدونم . اونوقت IP اونیکی سیستم رو میزنم و کانکت میشم و ...
حالا میخوام کاری کنم بجای اینکه خودم این کارو به صورت دستی انجام بدم و آی پی طرف مقابل رو وارد کنم . به محض اجرای برنامه IP و یا سام کامپیوتر اون فرد که برنامه رو اجرا کرده توی یه لیست ( حالا کامبوباکس ، لیست باکس و ... ) اضافه بشه . یعنی میخوام قبل از کانکت شدن این اتفاق بیفته . امیدوارم که کاملا منظورم رو رسونده باشم
با ابن دستور به برنامه کانکت میشم :
sock.Connect(IPAddress.Parse(ServerAddress_txt.Tex t), 8);

و با این دستور از طرف سرور ارتباط رو قبول میکنم :
TcpListener server = newTcpListener(ipAddress,port);
server.Start();
sock = server.AcceptSocket();




بعدش هم که میشه ارسال اطلاعات و ...

هنوز کدی واسه اون بخشی که سوال ازش پرسیدم ننوشتم . راستش از کد شما زیاد سر در نیاوردم . مشکلمم اینجاس زیاد نیس دارم با سی شارپ کار میکنمو الانم یهو مجبورا رفتم سراق Socket Programming ، ممنون میشم یجوری بگید یا یه کد ساده بگید که درست متوجه بشم و سر در بیارم
بازم ممنون

Saeed_m_Farid
یک شنبه 28 خرداد 1391, 17:47 عصر
من این برنامه رو روی دوتا کامپیوتر اجرا میکنم
امیدوارم که کاملا منظورم رو رسونده باشم



قسمت P2P based chat تو تاپیک جامع چت! (http://barnamenevis.org/showthread.php?346552-%D8%AA%D8%A7%D9%BE%DB%8C%DA%A9-%D8%AC%D8%A7%D9%85%D8%B9-%DA%86%D8%AA%21) رو مطالعه کنید.
از همون اول هم منظورتون رسیده بود، ولی میخواستم خودتون هم منظور خودتون رو بگیرین :
والا کارهای زیادی که انجام دادم !!! برنامم تمومه حدودا فقط ریزکاری هاش مونده . بعدش :
با ابن دستور به برنامه کانکت میشم : ... و با این دستور از طرف سرور ارتباط رو قبول میکنم : ... بعدش هم که میشه ارسال اطلاعات و ... نمیخوام بی احترامی کنم ولی "ما کارمون اینه و از این راه گذران زندگی می کنیم"، گذشته از این: ما هم قبلاً تو همون جاهایی بودیم که الان شما هستید ...

پس
بپذیرید و بیان کنید که پرسش شما، پرسشی دانشجویی است. منبع (http://barnamenevis.org/showthread.php?345086)

saman_h
یک شنبه 28 خرداد 1391, 20:49 عصر
قسمت P2P based chat تو تاپیک جامع چت! (http://barnamenevis.org/showthread.php?346552-%D8%AA%D8%A7%D9%BE%DB%8C%DA%A9-%D8%AC%D8%A7%D9%85%D8%B9-%DA%86%D8%AA%21) رو مطالعه کنید.
از همون اول هم منظورتون رسیده بود، ولی میخواستم خودتون هم منظور خودتون رو بگیرین : بعدش : نمیخوام بی احترامی کنم ولی "ما کارمون اینه و از این راه گذران زندگی می کنیم"، گذشته از این: ما هم قبلاً تو همون جاهایی بودیم که الان شما هستید ...
پس منبع (http://barnamenevis.org/showthread.php?345086)

دستتون درد نکنه آقا سعید خوب شرمندم کردیییییییییییییییید ... !!! توقع نداشتم ... !!! اگه دقت میکردید میدیدید که گفتم تازه دارم با C#‎ کار میکنم . واسه همینم بود که گفتم یه چیز قابل فهم تر میخوام که متوجش بشم نه اینکه بخوام چیزی رو کپی پیست کنم . شاید واسه شما این کارا آسون باشه اما من تا همینجاشم که پیش اومدم خیلی کارکردم و مطلب و پی دی اف گرفتم خوندم تا یچیزایی سر در بیارم . از آماده خوری هم شدیدا بدم میاد آدمی هم نیستم که بخوام دیگران واسم کارامو انجام بدن اما از پرسیدن و یاد گرفتن هم هیچوقت دریغ نمیکنم . اگه بازم بیشتر دقت میکردید میدیدید که نوشتم نمیخوام از توابع آماده ویندوز یا Dll ها استفاده کنم ... اینا همش دلیل هایی هستن که میتونه نشون بده دوست دارم یاد بگیرم نه اینکه واسه رفع تکلیفی بخوام کاری انجام بدم
بازهم ممنون ... ولی ...

saman_h
یک شنبه 28 خرداد 1391, 23:45 عصر
بهرحال بازهم ممنون میشم یکم واسم توضیح بدید که متوجه بشم و بتونم این کارو انجام بدم
بازم میگم من مثل شما ها حرفه ای نیستم ، اما دوست دارم یاد بگیرم ، پس یجوری بهم بگید که متوجه بشم ... چون زیاد سر در نمیارم
بازم پیشاپیش ممنون

saman_h
سه شنبه 30 خرداد 1391, 01:27 صبح
یه توضیح کوچولو : میخوام این اتفاق حتی قبل از کانکت شدن انجام بشه ... !!! یعنی اینکه به محض اجرای برنامه اونایی که برنامشون اجراس توی لیست برنامه اضافه بشن ! پس هنوز ارتباطی برقرار نشده .. اینو مد نظر بگیرید
اگه اشتباه نکنم باید یجوری از MultiCast یا BroadCast استفاده کنم . به این صورت که تو رنج ip خودم از 0 تا 254 رو پاکت بفرستم هرکی جواب داد اونو اضافه کنم . اما مساله اینجاس تو این حالت هرکی تو شبکه باشه جواب میده نه هرکی برنامش بازه !! ممنون میشم کسی بتونه راهنماییم کنه و یه کد آسون و قابل فهم بگه و واسم توضیحش بده چون میخوام یاد بگیرممممم نه اینکه فقط کپی کنم
با تشکر