C# 来帮帮忙~
新手一个,做计算机网络课设遇到的问题:1、在扫描单一接口时,为什么list中的count不计数呢?比如我检测本机的80端口是开放的,但是结果显示计数为0,连续多个端口扫描...
新手一个,做计算机网络课设遇到的问题:1、在扫描单一接口时,为什么list中的count不计数呢?比如我检测本机的80端口是开放的,但是结果显示计数为0,连续多个端口扫描是正确的。2、进行连续多个端口扫描时,为什么扫描是无序的?甚至输出的扫描结果有部分在最后总结的结果之后显示,这是什么原因?3、我想在Scan()中当判断端口是否打开的时候用if else直接输出结果,为什么else不能输出呢,必须用catch里才能输出?(程序不是自己原创的,网上找的自己在改,遇到问题现在有这几个不懂,请求高手不吝赐教!!拜谢!!!)程序代码:// C# 实现端口扫描namespace ConsoleApplication3{ class Program { //已扫描端口数目 internal static int scannedCount = 0; internal static int runningThreadCount = 0; internal static List<int> openedPorts = new List<int>(); static int startPort = 1; static int endPort = 500; static int maxThread = 100; static void Main(string[] args) { Console.WriteLine("请输入要扫描的主机:"); string host = Console.ReadLine(); Console.WriteLine("扫描单一端口或连续端口:"); Console.WriteLine("1.单一端口\n2.连续端口"); string s = Console.ReadLine(); int port1 = int.Parse(s); switch (port1) { case 1: { Console.WriteLine("请输入扫描的端口 例如:800"); string portRange1 = Console.ReadLine(); startPort = int.Parse(portRange1.Trim()); endPort = int.Parse(portRange1.Trim()); Scanner scanner1 = new Scanner(host, startPort); Thread thread1 = new Thread(new ThreadStart(scanner1.Scan)); thread1.Name = startPort.ToString(); thread1.IsBackground = true; thread1.Start(); runningThreadCount++; while (runningThreadCount >= maxThread) ; break; } case 2: { Console.WriteLine("请输入扫描的端口 例如:1-800"); string portRange = Console.ReadLine(); startPort = int.Parse(portRange.Split('-')[0].Trim()); endPort = int.Parse(portRange.Split('-')[1].Trim()); for (int port = startPort; port <= endPort; port++) { Scanner scanner = new Scanner(host, port); Thread thread = new Thread(new ThreadStart(scanner.Scan)); thread.Name = port.ToString(); thread.IsBackground = true; thread.Start(); runningThreadCount++; Thread.Sleep(100); //循环直到某个线程工作完毕才启动另一新线程
while (runningThreadCount >= maxThread) ; } while (scannedCount + 1 < (endPort - startPort)) ; break; } } Console.WriteLine(); Console.WriteLine(); //输出结果 Console.WriteLine("扫描主机:{0} 完成 \n扫描端口总数{1} \n开放端口总数:{2}", host, (endPort - startPort+1), openedPorts.Count); Console.ReadLine(); } }
class Scanner { string m_host; int m_port; public Scanner(string host, int port) { m_host = host; m_port = port; } public void Scan() { TcpClient tc = new TcpClient(); tc.SendTimeout = tc.ReceiveTimeout = 2000; try { tc.Connect(m_host, m_port); if (tc.Connected)
{ Console.WriteLine("端口:{0} 开放", m_port.ToString().PadRight(6)); Program.openedPorts.Add(m_port); } else { } }catch { Console.WriteLine("端口: {0} 关闭", m_port.ToString().PadRight(6)); } finally { tc.Close(); tc = null;Program.scannedCount++; Program.runningThreadCount--; }} }}
地方不够 只能这么发了 代码大家直接复制出去吧~~ 展开
while (runningThreadCount >= maxThread) ; } while (scannedCount + 1 < (endPort - startPort)) ; break; } } Console.WriteLine(); Console.WriteLine(); //输出结果 Console.WriteLine("扫描主机:{0} 完成 \n扫描端口总数{1} \n开放端口总数:{2}", host, (endPort - startPort+1), openedPorts.Count); Console.ReadLine(); } }
class Scanner { string m_host; int m_port; public Scanner(string host, int port) { m_host = host; m_port = port; } public void Scan() { TcpClient tc = new TcpClient(); tc.SendTimeout = tc.ReceiveTimeout = 2000; try { tc.Connect(m_host, m_port); if (tc.Connected)
{ Console.WriteLine("端口:{0} 开放", m_port.ToString().PadRight(6)); Program.openedPorts.Add(m_port); } else { } }catch { Console.WriteLine("端口: {0} 关闭", m_port.ToString().PadRight(6)); } finally { tc.Close(); tc = null;Program.scannedCount++; Program.runningThreadCount--; }} }}
地方不够 只能这么发了 代码大家直接复制出去吧~~ 展开
3个回答
展开全部
1、在扫描单一接口时,为什么list中的count不计数呢?
计数了,因为采用了多线程,主线程输出的时候子线程还没执行完毕。就像你同学本来有2瓶汽水,叫你帮忙买3瓶,你没回的时候他当然说总数是2.
解决方案:可以在thread1.start()后面加上thread1.join()表示等待。
2、进行连续多个端口扫描时,为什么扫描是无序的?
线程相当于多个人去做多件事情,有点人快有点人慢(就是有的人会抢位置些),所以顺序自然不定。除非你加入自己的机制。
3、我想在Scan()中当判断端口是否打开的时候用if else直接输出结果,为什么else不能输出呢,必须用catch里才能输出?
tc.Connect(m_host, m_port); 方法表示连接到该机器的指定端口,连接上了状态为已经连接,没连上会报异常,后面代码不会执行的。所以只能在catch做。
计数了,因为采用了多线程,主线程输出的时候子线程还没执行完毕。就像你同学本来有2瓶汽水,叫你帮忙买3瓶,你没回的时候他当然说总数是2.
解决方案:可以在thread1.start()后面加上thread1.join()表示等待。
2、进行连续多个端口扫描时,为什么扫描是无序的?
线程相当于多个人去做多件事情,有点人快有点人慢(就是有的人会抢位置些),所以顺序自然不定。除非你加入自己的机制。
3、我想在Scan()中当判断端口是否打开的时候用if else直接输出结果,为什么else不能输出呢,必须用catch里才能输出?
tc.Connect(m_host, m_port); 方法表示连接到该机器的指定端口,连接上了状态为已经连接,没连上会报异常,后面代码不会执行的。所以只能在catch做。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询