新人c#小白,各位专家帮忙看下,急!!!

说正题,winform做个设备管理界面,在学习论坛各位大神的帖子中也算是基本完成了开发,但在使用中发现问题,流程是登陆后获取到本机网卡,点击button发送搜索数据包,等待所有设备回应,将所有设备信息显示到listview中,我在存储设备信息时用的是二维string[,], 将string[,]再绘制到listview中,问题出在string[,]经常赋值不上,导致绘制listview时报错“未将对象引用设置到对象的实例”。具体请看代码注释<重点问题>,里边还有两个关于socket的<附加问题>,也请大家帮忙看看,多谢!
private string[,] scanList = new string[,] { };
private int scanIndex;
private static System.Timers.Timer procTimer;
static Socket mySocket;
private static IPEndPoint dstPoint;
private void ToolStripButton5_Click(object sender, EventArgs e)
{
DeviceScanPublicValue.searchPort = int.Parse(ToolStripTextBox1.Text);
DeviceScanPublicValue.devManagePort = 1208;
/*附加问题1:因为后边有1s的搜索窗口,为防止再次点击按钮触发socket套接字错误,把按钮去使能了,定时器里再使能
*这里也想请教大家,怎么在发生socket套接字错误时恢复,我现在是一旦发生这种错误就死掉了,只能重新打开应用
*/
ToolStripButton5.Text = "搜索中...";
ToolStripButton5.Enabled = false;
scanList = new string[511, 11];//最多511个设备
scanIndex = 0;
ListView2.Items.Clear();
byte[] sendData = { 0x44, 0x55, 0x44, 0x55, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20 };
//Socket处理
mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
mySocket.Bind(new IPEndPoint(IPAddress.Parse(DeviceScanPublicValue.localIP), DeviceScanPublicValue.searchPort));
Thread recvThread = new Thread(ReciveMessage)
{
IsBackground = true
};
recvThread.Start();
dstPoint = new IPEndPoint(IPAddress.Broadcast, DeviceScanPublicValue.devManagePort);
string hostName = Dns.GetHostName();
mySocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
Thread sendThread = new Thread(SendMessage);
sendThread.Start(sendData);
//创建一个1000ms定时的定时器,因为不知道有多少设备,给个1s的搜索窗口,定时器结束绘制listview
procTimer = new System.Timers.Timer(1000);
procTimer.Elapsed += OnTimedEvent;
procTimer.AutoReset = false;
procTimer.Enabled = true;
procTimer.Start();
}
private void SendMessage(object obj)
{
byte[] message = (byte[])obj;
mySocket.SendTo(message, dstPoint);
}
private void ReciveMessage()
{
EndPoint point = new IPEndPoint(IPAddress.Any, DeviceScanPublicValue.devManagePort);
Thread.Sleep(50);
/*附加问题2:搜索时,电脑网卡确实收到4个设备回应的报文,但有时就会出现socket接收不全的情况,比如只解析三个设备
*/
while (true)
{
try
{
Thread.Sleep(50);
byte[] buffer = new byte[100];
int length = mySocket.ReceiveFrom(buffer, ref point); //接收数据报
SearchMessageProc(buffer);
}
catch (Exception)
{
}
finally
{
}
}
}
struct DeviceList
{
public string type;
public string name;
public string location;
public string logicId;
public string ip;
public string mac;
public string port;
public string model;
public string timeModel;
public string timeIn;
public string status;
public string topology;
};
private void SearchMessageProc(object obj)
{
DeviceList devInfo;
byte[] message = (byte[])obj;
if (message[0] == 0x44 && message[1] == 0x55 && message[4] == 0x21)
{
/*
解析报文,得到devInfo,不贴代码了,太长了
*/
//整合搜索设备信息
string[] deviceScanInfo = { devInfo.name , devInfo.location , devInfo.logicId , devInfo.ip , devInfo.mac ,
devInfo.port , devInfo.model , devInfo.timeModel , devInfo.timeIn , devInfo.status , devInfo.topology };
for (int i = 0; i < 11; i++)
{
/*
重点问题:就在这,我测试用四个设备,scanList偶尔就会出现其中一个设备信息为null,但deviceScanInfo是正确的,
scanIndex也能加到4,这样就导致后边绘制listview时有null报错,百思不得其解
*/
scanList[scanIndex9000, i] = deviceScanInfo[i];
scanIndex++;
}
}
}
private ListViewItem scanDevList;
private void OnTimedEvent(object sender, ElapsedEventArgs e)
{
ListView2.BeginUpdate();
for (int i = 0; i < scanIndex; i++)
{
scanDevList = new ListViewItem
{
Text = (i + 1).ToString()
};
for (int j = 0; j < 11; j++)
{
scanDevList.SubItems.Add(scanList[i, j].ToString());
}
ListView2.Items.Add(scanDevList);
ListView2.Items[i].BackColor = Color.Lavender;
}
ListView2.EndUpdate();
ToolStripButton5.Text = "搜索设备";
ToolStripButton5.Enabled = true;
mySocket.Shutdown(SocketShutdown.Both);
mySocket.Close();
procTimer.Stop();
}
多谢各位了

相关推荐
C#40000字全套精华教程!!!从入门到精通,一篇就够了!!!
C#40000字全套精华教程!!!从入门到精通,一篇就够了!!! 本文摘选自菜鸟教程,csdn,以及本人学习的笔记资源,如果遇到显示或者格式其他问题可以直接查看pdf文件
用 C# 编写程序计算整数各位数字的总和
在编程中,我们常常需要对数字的各位进行操作。例如,计算一个整数的各位数字之和,这个问题在实际应用中也经常遇到。本文将介绍如何使用 C# 编写一个程序来计算整数的各位数字之和,同时提供完整的源代码。循环,循环中将整数每次除以 10 并取余数,得到的余数即为当前位的数字。由于整数是由一系列数字组成的,因此我们需要用到循环结构来进行遍历。以上便是用 C# 实现计算整数各位数字之和的完整代码。用 C# 编写程序计算整数各位数字的总和。变量用于累加各位数字之和。变为 0,循环结束。在上述代码中,我们首先通过。
C#:计算整数的各位数字总和
C#:计算整数的各位数字总和在C#编程中,我们经常需要对整数进行各种操作和计算。本文将介绍如何实现一个程序,用于计算给定整数的各位数字总和。我们将使用C#编写源代码,并提供详细说明。首先,让我们定义一个名为"CalculateDigitSum"的方法,该方法将接受一个整数作为输入,并返回其各位数字的总和。以下是完整的源代码: 让我们逐步解释代码的实现过程:首先,我们定义了一个名为"CalculateDigitSum"的静态方法,它接受一个整数作为输入,并返回各位数字的总和。在方法的内部,我们声明了一个变量"
C#趣味整蛊专家开源项目实战
WPF(Windows Presentation Foundation)是微软推出的基于 DirectX 的 UI 框架,支持更丰富的图形效果、数据绑定和样式设计,适合开发现代感强的桌面应用。WPF 使用来描述界面结构,它是一种基于 XML 的声明式语言。</Style><Button Content="样式按钮" Style="{StaticResource MyButtonStyle}"/>// 定义一个委托// 定义一个事件发布者类// 声明一个事件// 触发事件")
专家系统(c和c#实现)
本资料是用c和c#分别实现了专家系统,对初学者有很大的帮助!


