2010-04-02 13 views
13

में नेटवर्क पर कोई डिवाइस नेटवर्क पर है या नहीं, मैं घर सुरक्षा एप्लिकेशन विकसित कर रहा हूं। एक चीज जो मैं करना चाहता हूं वह स्वचालित रूप से इसे बंद कर देती है और इस आधार पर कि मैं घर पर हूं या नहीं। मेरे पास वाईफ़ाई वाला फ़ोन है जो घर पर होने पर स्वचालित रूप से मेरे नेटवर्क से कनेक्ट होता है।पिंग या अन्यथा बताएं कि मैक द्वारा सी #

फ़ोन कनेक्ट और डीएचसीपी के माध्यम से अपना पता प्राप्त करता है। जबकि मैं इसे एक स्थिर आईपी का उपयोग करने के लिए कॉन्फ़िगर कर सकता था, मैं नहीं चाहता था। क्या सी #/.NET में कोई भी 'पिंग' या समकक्ष है जो किसी डिवाइस के मैक पते को ले सकता है और मुझे बता सकता है कि यह वर्तमान में नेटवर्क पर सक्रिय है या नहीं?

संपादित करें: स्पष्ट करने के लिए, मैं एक पीसी है कि मैं एक ही लैन पर फोन का पता लगाने के लिए सक्षम हो करना चाहते हैं पर सॉफ्टवेयर चल रहा हूँ।

संपादित करें: यहां कोड है जो मैं आया था, स्पोलसन की मदद के लिए धन्यवाद। यह भरोसेमंद रूप से पता लगाता है कि मेरे द्वारा रुचि रखने वाले किसी भी फोन में घर में हैं या नहीं।

private bool PhonesInHouse() 
{ 

    Ping p = new Ping(); 
    // My home network is 10.0.23.x, and the DHCP 
    // pool runs from 10.0.23.2 through 10.0.23.127. 

    int baseaddr = 10; 
    baseaddr <<= 8; 
    baseaddr += 0; 
    baseaddr <<= 8; 
    baseaddr += 23; 
    baseaddr <<= 8; 

    // baseaddr is now the equivalent of 10.0.23.0 as an int. 

    for(int i = 2; i<128; i++) { 
     // ping every address in the DHCP pool, in a separate thread so 
     // that we can do them all at once 
     IPAddress ip = new IPAddress(IPAddress.HostToNetworkOrder(baseaddr + i)); 
     Thread t = new Thread(() => 
      { try { Ping p = new Ping(); p.Send(ip, 1000); } catch { } }); 
     t.Start(); 
    } 

    // Give all of the ping threads time to exit 

    Thread.Sleep(1000); 

    // We're going to parse the output of arp.exe to find out 
    // if any of the MACs we're interested in are online 

    ProcessStartInfo psi = new ProcessStartInfo(); 
    psi.Arguments = "-a"; 
    psi.FileName = "arp.exe"; 
    psi.RedirectStandardOutput = true; 
    psi.UseShellExecute = false; 
    psi.CreateNoWindow = true; 

    bool foundone = false; 
    using (Process pro = Process.Start(psi)) 
    { 
     using (StreamReader sr = pro.StandardOutput) 
     { 
      string s = sr.ReadLine(); 

      while (s != null) 
      { 
       if (s.Contains("Interface") || 
        s.Trim() == "" || 
        s.Contains("Address")) 
       { 
        s = sr.ReadLine(); 
        continue; 
       } 
       string[] parts = s.Split(new char[] { ' ' }, 
        StringSplitOptions.RemoveEmptyEntries); 

       // config.Phones is an array of strings, each with a MAC 
       // address in it. 
       // It's up to you to format them in the same format as 
       // arp.exe 
       foreach (string mac in config.Phones) 
       { 
        if (mac.ToLower().Trim() == parts[1].Trim().ToLower()) 
        { 
         try 
         { 
          Ping ping = new Ping(); 
          PingReply pingrep = ping.Send(parts[0].Trim()); 
          if (pingrep.Status == IPStatus.Success) 
          { 
           foundone = true; 
          } 
         } 
         catch { } 
         break; 
        } 
       } 
       s = sr.ReadLine(); 
      } 
     } 
    } 

    return foundone; 
} 
+1

यह प्रश्न आपको http://stackoverflow.com/questions/1148778/how-do-i-access-arp-protocol-Information-through-net की मदद कर सकता है। यह आपको आईएसी से मैक प्राप्त करने में मदद करेगा। या "arp -a" का उपयोग करें और आउटपुट पार्स करें। –

+0

क्या आप इसे दूसरी तरफ कर सकते हैं? जैसा कि आपके फोन पर एक एप्लिकेशन है जो यह पता लगाता है कि यह घर नेटवर्क पर कब होता है और फिर घर पर आपके एप्लिकेशन को बताता है कि यह सीमा के भीतर है? आम तौर पर जब आप कनेक्ट होते हैं तो आपको फ़ोन को सूचित करने के लिए फोन मिल सकता है। – jvilalta

+0

क्या यह स्क्रिप्ट का अंतिम संस्करण था? – cDima

उत्तर

2

ping और arp उपकरण का उपयोग करने के लिए एक अलग दृष्टिकोण है। चूंकि एआरपी पैकेट केवल उसी प्रसारण डोमेन में रह सकते हैं, इसलिए आप अपने नेटवर्क के प्रसारण पते को पिंग कर सकते हैं और प्रत्येक ग्राहक एआरपी प्रतिक्रिया के साथ जवाब देगा। उन प्रतिक्रियाओं में से प्रत्येक को आपकी एआरपी तालिका में कैश किया जाता है, जिसे आप arp -a कमांड के साथ देख सकते हैं।

rem Clear ARP cache 
netsh interface ip delete arpcache 

rem Ping broadcast addr for network 192.168.1.0 
ping -n 1 192.168.1.255 

rem View ARP cache to see if the MAC addr is listed 
arp -a 

इनमें से कुछ ऐसे System.Net.NetworkInformation नाम स्थान में के रूप में प्रबंधित कोड में किया जा सकता है,: ठहरनेवाला तो।

नोट: एआरपी कैश साफ़ करने से अन्य स्थानीय सर्वरों की कैश प्रविष्टियों को साफ़ करके नेटवर्क प्रदर्शन पर मामूली प्रभाव पड़ सकता है। हालांकि, कैश को आमतौर पर हर 20 मिनट या उससे कम तक साफ़ किया जाता है।

+0

ठीक देखना चाहते हैं, अब मैं घर पर हूं और इसके साथ खेलने का समय है, मैंने अभी कोशिश की है, और केवल यह डिवाइस मेरे डेस्कटॉप पीसी और मेरे फाइल सर्वर हैं। यह नेटवर्क पर अधिकांश अन्य उपकरणों को याद करता है (वायरलेस एडाप्टर, फोन, प्रिंटर, अन्य लैपटॉप कंप्यूटर, कुछ वर्चुअल मशीन ...) एक डिवाइस जो इसे उठाता है वह दो स्विच दूर है। –

+1

परीक्षण करने के लिए, आईपी द्वारा उन मिस्ड डिवाइसों में से एक को पिंग करने का प्रयास करें, फिर 'arp -a' जांचें। अगर यह काम करता है, तो शायद डिवाइस प्रसारण पिंग्स का जवाब नहीं देता है। :/शायद यह सब के बाद सबसे अच्छा तरीका नहीं है। – spoulson

1

आप RARP protocol का उपयोग करें कि मैक पता मालिक है जो की एक अनुरोध प्रसारित करने के लिए कर सकता है। मालिक अपने आईपी पते के साथ जवाब देगा। मुझे अनुशंसा करने के लिए एक आरएआरपी उपकरण या पुस्तकालय के बारे में पता नहीं है, इसलिए आप इन पैकेट भेजने/प्राप्त करने के लिए अपनी खुद की नेटवर्क परत लिखने पर विचार कर सकते हैं।

+1

आपको ऐसा करने के लिए कच्चे सॉकेट की आवश्यकता होगी - हमें बताएं कि आपने इसे कब किया है, हम – pm100