كيفية كتابة برنامج للإبلاغ عن عنوان IP المحلي مثل 192.168.1.102؟

StackOverflow https://stackoverflow.com/questions/859356

سؤال

نظرًا لأن جهاز التوجيه Linksys الخاص بي لا يعين عنوان IP محليًا ثابتًا لأجهزة الكمبيوتر (أجهزة الكمبيوتر الشخصية وأجهزة Mac وLinux)، أرغب في كتابة برنامج نصي بحيث يتم تحديث أجهزة الكمبيوتر لبعضها البعض كل دقيقة بحيث

http://localhost/list.html

على كل جهاز قائمة بأسماء جميع أجهزة الكمبيوتر الشخصية وأجهزة Mac ورابط إلى خادم Apache الخاص بهم (يشير إلى http://192.168.1.102, ، إلخ)

يبدو أن الطريقة لمعرفة عنوان IP المحلي هي عن طريق ipconfig على جهاز الكمبيوتر، وifconfig على نظامي التشغيل Mac وLinux، وللقيام بذلك برمجيًا، سيكون gethostbyname().

لكنني حاولت على روبي، ذلك

irb(main):001:0> require 'socket'
=> true

irb(main):002:0> p Socket::gethostbyname("localhost")
["Core2Duo", [], 2, "\177\000\000\001"]

irb(main):005:0> p Socket::gethostbyname("core2duo")
["Core2Duo", [], 2, "\300\250\001g"]
=> nil

ويظهر ipconfig في الواقع

IPv4 Address. . . . . . . . . . . : 192.168.1.103

فهل هذه هي الطريقة الصحيحة للقيام بذلك؟يمكنني اختراقه عن طريق تنفيذ "ipconfig" في Ruby واستخدام التعبير العادي للحصول على النتيجة، ولكن سيكون من الجيد القيام بذلك باستخدام طريقة أكثر قياسية.

هل كانت مفيدة؟

المحلول

على Socket::getaddrinfo قد يكون أكثر من ما كنت تبحث عنه:

Socket::getaddrinfo('localhost', 'http')
[["AF_INET", 80, "localhost", "127.0.0.1", ...]]

Socket::getaddrinfo('core2duo', 'http')
[["AF_INET", 80, "Core2Duo", "192.168.1.103", ...]]

وأو، قد حاولت فقط:

Socket::getaddrinfo('core2duo', 'http')[0][3]
"192.168.1.103"

نصائح أخرى

ويمكنك القيام بذلك في جاوة باستخدام:

Socket s = new Socket();
s.getLocalSocketAddress();

إذا قمت بتشغيل صباح الخير على أنظمة ويندوز وavahi على أنظمة لينكس، يمكنك التخلص من الحاجة إلى تحديد عنوان IP لكل نظام. ثم يمكنك ببساطة معالجة كل النظام باستخدام "hostname.local". مزيد من المعلومات هنا .

لماذا لا مجرد إيقاف DHCP لتلك الآلات وتعيينها عناوين IP ثابتة؟

وتحرير ردا على تصريحات: على الأقل كما هو وثلاث سنوات أو قبل ذلك (آخر مرة اشتريت جهاز التوجيه)، والموجهات لينكسيس سمحت لك لتعيين عنوان IP السفلي لالمدمج في خادم DHCP. بعد ذلك، يمكنك الذهاب إلى إعداد الشبكة الآلات الفردية، تعطيل DHCP، وتعيين العناوين الفعلية. على سبيل المثال، على شبكة بيتي الموجه هو 192.168.1.1، وTerastation هو 1.2، الطابعة 1.3، بلدي مربع لينكس هو 1.99، ويتم تكوين جهاز التوجيه لنعطيه 1،100 وما فوق.

والمشكلة في السيناريو روبي قد يكون عدم وجود تحليل اسم DNS على الشبكة، وهذا غالبا ما يتم إخفاء إذا كنت عادة تبادل الأشياء بين أجهزة الكمبيوتر مع SMB / CIFS لأن ذلك قد حان الخاصة بروتوكول اسم الاكتشاف.

إذا كنت ستقوم ببث مخططات بيانات تحتوي على معلومات الاسم/IP، فلن تحتاج حقًا إلى جهاز كمبيوتر لمعرفة عنوان IP الخاص به.فقط أرسل مخطط البيانات الذي يحتوي على اسمه، ثم استخدمه ريكفروم () - أو ما يعادله - للقبض عليه في أجهزة الكمبيوتر الأخرى.وبهذه الطريقة يمكن للمستقبلين استخراج عنوان IP الخاص بالمرسل مباشرة عبر ملف ريكفروم () وظيفة.

كمكافأة، يجب أن يعمل ذلك عندما يكون جهاز الكمبيوتر المرسل به أكثر من محول شبكة واحد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top