C#获取局域网中的活动Ip地址
C#在局域网中获取活动Ip地址,这在控制台应用程序中运行良好,当它出现在基于表单的应用程序中时,我遇到错误,我是C#新手,请帮助。获取非静态字段的错误对象引用C#获取局域网中的活动Ip地址,c#,windows,ip,C#,Windows,Ip,C#在局域网中获取活动Ip地址,这在控制台应用程序中运行良好,当它出现在基于表单的应用程序中时,我遇到错误,我是C#新手,请帮助。获取非静态字段的错误对象引用 namespace WindowsFormsApplication1 { public partial class Form1 : Form { private static List<Ping> pingers = new List<Ping>(); private static int ins
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();
}
}
}
命名空间窗口窗体应用程序1
{
公共部分类Form1:Form
{
私有静态列表pingers=新列表();
私有静态int实例=0;
私有静态对象@lock=new object();
私有静态int结果=0;
私有静态int超时=250;
私有静态int ttl=5;
公共字符串IP;
公共表格1()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
IP=textBox1.Text;
字符串baseIP=“192.168.1。”;
WriteLine(“ping{0}*”,baseIP中D类的255个目的地);
创建器(255);
PingOptions po=新的PingOptions(ttl,true);
System.Text.asciencoding enc=新的System.Text.asciencoding();
byte[]data=enc.GetBytes(“ababababababababababab”);
SpinWait wait=新的SpinWait();
int-cnt=1;
秒表=Stopwatch.StartNew();
foreach(pinger中的pingp)
{
锁(@lock)
{
实例+=1;
}
p、 SendAsync(string.Concat(baseIP,cnt.ToString()),超时,数据,po);
cnt+=1;
}
而(实例>0)
{
等等,自旋一次();
}
看,停;
驱逐舰();
WriteLine(“在{0}中完成。找到{1}个活动IP地址。”,watch.appeased.ToString(),result);
Console.ReadKey();
}
公共静态无效Ping_已完成(对象s、PingCompletedEventArgs e)
{
锁(@lock)
{
实例-=1;
}
if(e.Reply.Status==IPStatus.Success)
{
IP=e.Reply.Address.ToString();
结果+=1;
}
其他的
{
//Console.WriteLine(String.Concat(“非活动IP:,e.Reply.Address.ToString()))
}
}
专用静态void创建器(int cnt)
{
对于(int i=1;i您会收到此错误,因为IP被声明为非静态字段,并在静态方法中使用。您在类中使用IP“变量”作为字段
public String IP;
但您无法访问静态方法中的字段。据我所知,您的3个方法不需要是静态的。我猜这是从控制台应用程序复制/粘贴的结果,您在控制台应用程序中将方法编码为静态:)
因此,您需要:
- 通过删除static关键字使方法非静态,或
- 通过添加static关键字,使所有字段(在静态方法中访问)成为静态的
我建议您将所有成员设置为非静态的,因为它们“属于”表单。最后,此代码起作用
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();
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Windows.Forms;
使用System.Net.NetworkInformation;
使用系统线程;
使用系统诊断;
Net系统;
命名空间Windows窗体应用程序3
{
公共部分类Form1:Form
{
私有静态列表pingers=新列表();
私有静态int实例=0;
私有静态对象@lock=new object();
私有静态int结果=0;
私有静态int超时=250;
私有静态int ttl=5;
私有静态字符串[]IPs=新字符串[100];
公共表格1()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
字符串baseIP=“192.168.1。”;
IP.Items.Add(“在“+baseIP+“xxx”中ping 255个D级目的地”);
创建器(255);
PingOptions po=新的PingOptions(ttl,true);
System.Text.asciencoding enc=新的System.Text.asciencoding();
byte[]data=enc.GetBytes(“ababababababababababab”);
SpinWait wait=新的SpinWait();
int-cnt=1;
秒表=Stopwatch.StartNew();
foreach(pinger中的pingp)
{
锁(@lock)
{
实例+=1;
}
p、 SendAsync(string.Concat(baseIP,cnt.ToString()),超时,数据,po);
cnt+=1;
}
}
公共静态无效Ping_已完成(对象s、PingCompletedEventArgs e)
{
锁(@lock)
{
实例-=1;
}
if(e.Reply.Status==IPStatus.Success)
{
Console.WriteLine(string.Concat(“活动IP:”,e.Reply.Address.ToString());
IPs[result]=e.Reply.Address.ToString();
结果+=1;
}
其他的
{
//Console.WriteLine(String.Concat(“非活动IP:,e.Reply.Address.ToString()))
}
}
专用静态void创建器(int cnt)
{
对于(int i=1;我已尝试从您发送的代码文件中的所有方法和变量中删除静态关键字?;)