请教如何优化这段代码

International_novice 2008-06-16 12:25:47
我找到1段代码,是有关端口检测的:
private void button1_Click(object sender, EventArgs e)
{
//扫描端口
int iStart=(int)this.numericUpDown1.Value;
int iEnd=(int)this.numericUpDown2.Value;
try
{
this.progressBar1.Minimum=iStart;
this.progressBar1.Maximum=iEnd;
this.richTextBox1.Text="程序开始扫描端口:\n";
this.richTextBox1.Update();
for(int i=iStart ;i<iEnd;i++)
{
this.progressBar1.Value = i;
TcpClient MyTCP = null;
try
{
MyTCP = new TcpClient(this.textBox1.Text, i);
this.richTextBox1.Text += "端口 " + i.ToString() + " 开放!\n";
this.richTextBox1.Update();
}
catch
{
}
}
this.richTextBox1.Text+="扫描端口结束!\n";
}
catch(Exception Err)
{
MessageBox.Show("扫描端口操作发生错误,错误信息是:"+Err.Message,"信息提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
这段代码虽然可以实现检测开放的端口,但运行起来相当的慢,查找1~50以内开放的端口就要用1分钟左右的时间.还请各位高人指点下如何改进这段代码,谢谢
...全文
81 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我对代码做了这样修改(就是想办法改成多线程的):
int StartPort;
int n;

private void Check()
{
try
{
for (int i = StartPort; i < n; i++)
{
this.progressBar1.Value = i;
TcpClient MyTCP = null;
try
{
MyTCP = new TcpClient(this.textBox1.Text, i);
this.richTextBox1.Text += "端口 " + i.ToString() + " 开放!\n";
//this.richTextBox1.Update();
}
catch
{
}
}
richTextBox1.Text += "扫描端口结束!\n";
}
catch (Exception Err)
{
//MessageBox.Show("扫描端口操作发生错误,错误信息是:" + Err.Message, "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.Close();
}
}

private void button1_Click(object sender, EventArgs e)
{
//扫描端口
int iStart=(int)this.numericUpDown1.Value;
int iEnd=(int)this.numericUpDown2.Value;
this.progressBar1.Minimum = iStart;
this.progressBar1.Maximum = iEnd;
n = iEnd / 10;
Thread[] Check_Ports = new Thread[10];
ThreadStart start_Check_Ports = new ThreadStart(Check);
for (int i = 0; i < 10; i++)//开启指定数量的线程数
{
StartPort = i * n;
Check_Ports[i] = new Thread(start_Check_Ports);//指定线程起始设置
Check_Ports[i].Start();//逐个开启线程
}
}
可是运行时报错:"线程间操作无效: 从不是创建控件“Form1”的线程访问它。"
我找不到其中错误``还请高人指点~谢谢
贫僧又回来了 2008-06-16
  • 打赏
  • 举报
回复
你这段代码好象是一个教程里面的!
第7章 网络应用\实例135 如何扫描端口
不过哪本书或者哪个教程我就不清楚了!
呵呵
guying999 2008-06-16
  • 打赏
  • 举报
回复
多线程,每个线程检查一个范围内的端口,比如线程1检查1-20 线程2检查21-40等
yilanwuyu123 2008-06-16
  • 打赏
  • 举报
回复
mark 解决了楼上的问题再说。
足球中国 2008-06-16
  • 打赏
  • 举报
回复
增加一点,最好放到线程里.不然界也显示的不好
noky 2008-06-16
  • 打赏
  • 举报
回复
1、看你的代码,如果端口从1到3128,那么就要循环3128次,并且new出来了3128个TcpClient对象,你岂不知TcpClient对象是要消耗系统资源的。
2、即使不是这个目的,那也应该为Tcpclient设置超时吧,如果网络环境不好,超时会很长的。
3、你的代码需要运行在理想环境下才能正常运行,应为一旦抛出错误还是一样的运行。知道运行结束位置,这有些不讲道理呀。有问题就要解决,你不能在catch中不管不顾吧!

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧