2014-12-03 86 views
0

C#獲取局域網活動IP地址,這個工作正常的控制檯應用程序,溫家寶談到基於表單的應用程序會收到錯誤,IAM新的C#請幫助。得到一個錯誤的對象引用非靜態字段C#中獲取LAN活動IP地址

namespace WindowsFormsApplication1 
{ 

public partial class Form1 : Form 
{ 
    private static List<Ping> pingers = new List<Ping>(); 
    private static int instances = 0; 

    private static object @lock = new object(); 

    private static int result = 0; 
    private static int timeOut = 250; 

    private static int ttl = 5; 
    public String IP; 


    public Form1() 
    { 
     InitializeComponent(); 
    } 





    private void button1_Click(object sender, EventArgs e) 
      { 

       IP = textBox1.Text; 



        string baseIP = "192.168.1."; 

        Console.WriteLine("Pinging 255 destinations of D-class in {0}*", baseIP); 

        CreatePingers(255); 

        PingOptions po = new PingOptions(ttl, true); 
        System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); 
        byte[] data = enc.GetBytes("abababababababababababababababab"); 

        SpinWait wait = new SpinWait(); 
        int cnt = 1; 

        Stopwatch watch = Stopwatch.StartNew(); 

           foreach (Ping p in pingers) 
           { 
            lock (@lock) 
            { 
             instances += 1; 
            } 

            p.SendAsync(string.Concat(baseIP, cnt.ToString()), timeOut, data, po); 
            cnt += 1; 
           } 

        while (instances > 0) 
        { 
         wait.SpinOnce(); 
        } 

        watch.Stop(); 

        DestroyPingers(); 

        Console.WriteLine("Finished in {0}. Found {1} active IP-addresses.", watch.Elapsed.ToString(), result); 
        Console.ReadKey(); 
      } 



         public static void Ping_completed(object s, PingCompletedEventArgs e) 

        { 
         lock (@lock) 
         { 
          instances -= 1; 
         } 

         if (e.Reply.Status == IPStatus.Success) 
         { 
          IP = e.Reply.Address.ToString(); 
          result += 1; 
         } 
         else 
         { 
          //Console.WriteLine(String.Concat("Non-active IP: ", e.Reply.Address.ToString())) 
         } 
        } 


          private static void CreatePingers(int cnt) 
          { 
           for (int i = 1; i <= cnt; i++) 
           { 
            Ping p = new Ping(); 
            p.PingCompleted += Ping_completed; 
            pingers.Add(p); 
           } 
          } 

           private static void DestroyPingers() 
            { 
            foreach (Ping p in pingers) 
             { 
              p.PingCompleted -= Ping_completed; 
              p.Dispose(); 
             } 

             pingers.Clear(); 

            } 

} 

} 

回答

0

最後此代碼的工作。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Net.NetworkInformation; 
using System.Threading; 
using System.Diagnostics; 
using System.Net; 


namespace WindowsFormsApplication3 
{ 
public partial class Form1 : Form 
{ 
    private static List<Ping> pingers = new List<Ping>(); 
    private static int instances = 0; 

    private static object @lock = new object(); 

    private static int result = 0; 
    private static int timeOut = 250; 

    private static int ttl = 5; 
    private static string[] IPs=new string[100]; 

    public Form1() 
    { 
     InitializeComponent(); 

    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     string baseIP = "192.168.1."; 

     IP.Items.Add("Pinging 255 destinations of D-class in " + baseIP+"xxx"); 

     CreatePingers(255); 


     PingOptions po = new PingOptions(ttl, true); 
     System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); 
     byte[] data = enc.GetBytes("abababababababababababababababab"); 

     SpinWait wait = new SpinWait(); 
     int cnt = 1; 

     Stopwatch watch = Stopwatch.StartNew(); 

     foreach (Ping p in pingers) 
     { 
      lock (@lock) 
      { 
       instances += 1; 
      } 

      p.SendAsync(string.Concat(baseIP, cnt.ToString()), timeOut, data, po); 
      cnt += 1; 

     } 


    } 

    public static void Ping_completed(object s, PingCompletedEventArgs e) 
    { 
     lock (@lock) 
     { 
      instances -= 1; 
     } 

     if (e.Reply.Status == IPStatus.Success) 
     { 

      Console.WriteLine(string.Concat("Active IP: ", e.Reply.Address.ToString())); 

      IPs[result] = e.Reply.Address.ToString(); 
      result += 1; 
     } 
     else 
     { 
      //Console.WriteLine(String.Concat("Non-active IP: ", e.Reply.Address.ToString())) 
     } 
    } 


    private static void CreatePingers(int cnt) 
    { 
     for (int i = 1; i <= cnt; i++) 
     { 
      Ping p = new Ping(); 
      p.PingCompleted += Ping_completed; 
      pingers.Add(p); 
     } 
    } 

    private static void DestroyPingers() 
    { 
     foreach (Ping p in pingers) 
     { 
      p.PingCompleted -= Ping_completed; 
      p.Dispose(); 
     } 

     pingers.Clear(); 

    } 
0

因爲IP被聲明爲一個非靜態字段和靜態方法被用來您收到此錯誤。

1

您使用IP「變量」的領域類。

public String IP; 

但是你不能訪問靜態方法中的字段。據我所見,不需要你的3種方法是靜態的。我想這是從控制檯應用程序,在那裏你編碼你的方法是靜態的:)

所以你需要既可以複製/粘貼的結果:

  • 讓你的方法非靜態通過移除static關鍵字,或
  • 讓所有的字段(即在靜態方法中訪問)靜態加static關鍵字

我建議你使所有成員的非靜態的,因爲它們「屬於」表格。

+0

對不起夥計它不是工作。 – Crysis 2014-12-13 05:41:18

+0

你試圖去除所有的代碼文件中的方法和變量您發送的靜態關鍵字? ;) – 2014-12-16 08:15:44