本文实例为大家分享了c#端口扫描器的编写代码,供大家参考,具体内容如下
一、项目设计
新建项目
整体设计
最终设计
二、单线程
1.代码编写
button
using system; using system.collections.generic; using system.componentmodel; using system.data; using system.drawing; using system.linq; using system.net.sockets; using system.text; using system.threading; using system.threading.tasks; using system.windows.forms; namespace duankou { public partial class form1 : form { private string hostaddress; //起始端口 private int start; //终止端口 private int end; //端口号 private int port; //定义线程对象 private thread scanthread; public form1() { initializecomponent(); } private void label1_click(object sender, eventargs e) { } private void label2_click(object sender, eventargs e) { } private void label4_click(object sender, eventargs e) { } private void button1_click(object sender, eventargs e) { try { //初始化 tbshow.clear(); lb.text = "0%"; //获取ip地址和始末端口号 hostaddress = tbhost.text; start = int32.parse(tbsport.text); end = int32.parse(tbeport.text); if (decideaddress()) // 端口合理 { //让输入的textbox只读,无法改变 tbhost.readonly = true; tbsport.readonly = true; tbeport.readonly = true; //设置进度条的范围 pb.minimum = start; pb.maximum = end; //显示框显示 tbshow.appendtext("端口扫描器 v1.0.0" + environment.newline + environment.newline); //调用端口扫描函数 portscan(); } else { //若端口号不合理,弹窗报错 messagebox.show("输入错误,端口范围为[0-65536]!"); } } catch { //若输入的端口号为非整型,则弹窗报错 messagebox.show("输入错误,端口范围为[0-65536]!"); } } /// <summary> /// 判断端口是否合理 /// </summary> /// <returns></returns> private bool decideaddress() { //判断端口号是否合理 if ((start >= 0 && start <= 65536) && (end >= 0 && end <= 65536) && (start <= end)) return true; else return false; } private void portscan() { double x; string xian; //显示扫描状态 tbshow.appendtext("开始扫描...(可能需要请您等待几分钟)" + environment.newline + environment.newline); //循环抛出线程扫描端口 for (int i = start; i <= end; i++) { x = (double)(i - start + 1) / (end - start + 1); xian = x.tostring("0%"); port = i; //调用端口i的扫描操作 scan(); //进度条值改变 lb.text = xian; lb.refresh(); pb.value = i; } tbshow.appendtext(environment.newline + "扫描结束!" + environment.newline); //输入框textbox只读属性取消 tbhost.readonly = false; tbsport.readonly = false; tbeport.readonly = false; } /// <summary> /// 扫描某个端口 /// </summary> private void scan() { int portnow = port; //创建tcpclient对象,tcpclient用于为tcp网络服务提供客户端连接 tcpclient objtcp = null; try { //用于tcpclient对象扫描端口 objtcp = new tcpclient(hostaddress, portnow); //扫描到则显示到显示框 tbshow.appendtext("端口 " + port + " 开放!" + environment.newline); } catch { //未扫描到,则会抛出错误 } } } }
2.扫描结果
开始
1分钟结束 没有端口开放
三、多线程
1.代码编写
button
using system; using system.collections.generic; using system.componentmodel; using system.data; using system.drawing; using system.linq; using system.net.sockets; using system.text; using system.threading; using system.threading.tasks; using system.windows.forms; namespace duankou { public partial class form1 : form { private string hostaddress; //起始端口 private int start; //终止端口 private int end; //端口号 private int port; //定义线程对象 private thread scanthread; //定义端口状态数据(开放则为true,否则为false) private bool[] done = new bool[65526]; private bool ok; public form1() { initializecomponent(); //不进行跨线程检查 checkforillegalcrossthreadcalls = false; } private void label1_click(object sender, eventargs e) { } private void label2_click(object sender, eventargs e) { } private void label4_click(object sender, eventargs e) { } private void button1_click(object sender, eventargs e) { try { //初始化 tbshow.clear(); lb.text = "0%"; //获取ip地址和始末端口号 hostaddress = tbhost.text; start = int32.parse(tbsport.text); end = int32.parse(tbeport.text); if (decideaddress()) // 端口合理 { //让输入的textbox只读,无法改变 tbhost.readonly = true; tbsport.readonly = true; tbeport.readonly = true; //创建线程,并创建threadstart委托对象 thread process = new thread(new threadstart(portscan)); process.start(); //设置进度条的范围 pb.minimum = start; pb.maximum = end; //显示框显示 tbshow.appendtext("端口扫描器 v1.0.0" + environment.newline + environment.newline); } else { //若端口号不合理,弹窗报错 messagebox.show("输入错误,端口范围为[0-65536]!"); } } catch { //若输入的端口号为非整型,则弹窗报错 messagebox.show("输入错误,端口范围为[0-65536]!"); } } /// <summary> /// 判断端口是否合理 /// </summary> /// <returns></returns> private bool decideaddress() { //判断端口号是否合理 if ((start >= 0 && start <= 65536) && (end >= 0 && end <= 65536) && (start <= end)) return true; else return false; } private void portscan() { double x; string xian; //显示扫描状态 tbshow.appendtext("开始扫描...(可能需要请您等待几分钟)" + environment.newline + environment.newline); //循环抛出线程扫描端口 for (int i = start; i <= end; i++) { x = (double)(i - start + 1) / (end - start + 1); xian = x.tostring("0%"); port = i; //使用该端口的扫描线程 scanthread = new thread(new threadstart(scan)); scanthread.start(); //使线程睡眠 system.threading.thread.sleep(100); //进度条值改变 lb.text = xian; pb.value = i; } while (!ok) { ok = true; for (int i = start; i <= end; i++) { if (!done[i]) { ok = false; break; } } system.threading.thread.sleep(1000); } tbshow.appendtext(environment.newline + "扫描结束!" + environment.newline); //输入框textbox只读属性取消 tbhost.readonly = false; tbsport.readonly = false; tbeport.readonly = false; } /// <summary> /// 扫描某个端口 /// </summary> private void scan() { int portnow = port; //创建线程变量 thread threadnow = scanthread; //扫描端口,成功则写入信息 done[portnow] = true; //创建tcpclient对象,tcpclient用于为tcp网络服务提供客户端连接 tcpclient objtcp = null; try { //用于tcpclient对象扫描端口 objtcp = new tcpclient(hostaddress, portnow); //扫描到则显示到显示框 tbshow.appendtext("端口 " + port + " 开放!" + environment.newline); } catch { //未扫描到,则会抛出错误 } } } }
2.扫描结果
开始
5秒结束
小结
多线程能够有更好的cpu使用率,程序设计更简单,更快的程序响应速度。
链接
c#单线程和多线程端口扫描器
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。