C# 多线程与线程扫描器
多线程是一种复杂的编程技术,可以同时运行多个独立的线程来处理各种任务。在C#中,可以使用Thread类和ThreadPool类来实现多线程编程。Thread类用于创建和控制线程。可以使用Thread.Start()方法启动一个新的线程,并使用Thread.Join()方法等待线程完成。
获取本机IP地址
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
public static List<string> GetLocalAddress(string netType)
{
string HostName = Dns.GetHostName();
IPAddress[] address = Dns.GetHostAddresses(HostName);
List<string> IpList = new List<string>();
if(netType == string.Empty)
{
for (int i = 0; i < address.Length; i++)
{
IpList.Add(address[i].ToString());
}
}
else
{
for (int i = 0; i < address.Length; i++)
{
if (address[i].AddressFamily.ToString() == netType)
{
IpList.Add(address[i].ToString());
}
}
}
return IpList;
}
static void Main(string[] args)
{
// 获取IPV4地址
List<string> ipv4 = GetLocalAddress("InterNetwork");
foreach (string each in ipv4)
Console.WriteLine(each);
// 获取IPV6地址
List<string> ipv6 = GetLocalAddress("InterNetworkV6");
foreach (string each in ipv6)
Console.WriteLine(each);
Console.ReadKey();
}
}
}
线程操作基础
using System;
using System.Collections;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
// 定义一个无参线程函数
public static void My_Thread()
{
Console.WriteLine("线程函数已运行");
}
static void Main(string[] args)
{
string strinfo = string.Empty;
ThreadStart childref = new ThreadStart(My_Thread);
Thread thread = new Thread(childref);
thread.Start();
Console.WriteLine("线程唯一标识符: " + thread.ManagedThreadId);
Console.WriteLine("线程名称: " + thread.Name);
Console.WriteLine("线程状态: " + thread.ThreadState.ToString());
Console.WriteLine("线程优先级: " + thread.Priority.ToString());
Console.WriteLine("是否为后台线程: " + thread.IsBackground);
Thread.Sleep(1000);
thread.Join();
Console.ReadKey();
}
}
}
线程传递参数
using System;
using System.Collections;
using System.Threading;
namespace ConsoleApplication1
{
public struct ThreadObj
{
public string name;
public int age;
public ThreadObj(string _name, int _age)
{
this.name = _name;
this.age = _age;
}
}
class Program
{
// 定义一个无参线程函数
public static void My_Thread(object obj)
{
ThreadObj thread_path = (ThreadObj)obj;
Console.WriteLine("姓名: {0} 年纪: {1}", thread_path.name, thread_path.age);
Thread.Sleep(3000);
}
static void Main(string[] args)
{
for(int x=0;x<200;x++)
{
ThreadObj obj = new ThreadObj("admin", x);
Thread thread = new Thread(My_Thread);
thread.IsBackground = true;
thread.Start(obj);
}
Console.ReadKey();
}
}
}
实现端口扫描
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// FTP, SSH, Telnet, SMTP, HTTP, POP3, RPC, SMB, SMTP, IMAP, POP3
int[] Port = new int[] { 21, 22, 23, 25, 80, 110, 135, 445, 587, 993, 995 };
foreach(int each in Port)
{
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
try
{
sock.Connect("192.168.1.10",each);
if(sock.Connected)
{
Console.WriteLine("端口开启:" + each);
}
}
catch
{
Console.WriteLine("端口关闭:" + each);
sock.Close();
}
}
}
}
}
多线程端口扫描
using System;
using System.Net;
using System.Net.Sockets;
namespace TimeoutPortScan
{
class TimeoutPortScan
{
private IPAddress ip;
private readonly int[] ports = new int[] { 21, 22, 23, 25, 53, 80, 110, 118, 135, 143, 156, 161,
443, 445, 465, 587, 666, 990, 991, 993, 995, 1080, 1433, 1434, 1984, 2049, 2483, 2484, 3128,
3306, 3389, 4662, 4672, 5222, 5223, 5269, 5432, 5500, 5800, 5900, 8000, 8008, 8080 };
public bool Connect(IPEndPoint remoteEndPoint, int timeoutMSec)
{
Socket scanSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
try
{
IAsyncResult result = scanSocket.BeginConnect(remoteEndPoint, null, null);
bool success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromMilliseconds(timeoutMSec), false);
if (result.IsCompleted && scanSocket.Connected)
{
scanSocket.EndConnect(result);
return true;
}
else
return false;
}
finally
{
scanSocket.Close();
}
}
static void Main(string[] args)
{
TimeoutPortScan ps = new TimeoutPortScan();
for (int x = 1; x < 255;x++ )
{
string addr = string.Format("192.168.1.{0}", x);
IPAddress.TryParse(addr, out ps.ip);
for (int num = 0; num < ps.ports.Length; num++)
{
if (ps.Connect(new IPEndPoint(ps.ip, ps.ports[num]), 100))
Console.WriteLine("IP:{0} --> 端口: {1} --> 状态: Open", addr,ps.ports[num]);
}
}
}
}
}
异步端口扫描
using System;
using System.Net;
using System.Net.Sockets;
using System.Collections;
namespace AsyncPortScan
{
class AsyncPortScan
{
static void Main(string[] args)
{
IPAddress ip;
int startPort, endPort;
if (GetPortRange(args, out ip, out startPort, out endPort) == true) // 提取命令行参数
Scan(ip, startPort, endPort); // 端口扫描
}
/// 从命令行参数中提取端口
private static bool GetPortRange(string[] args, out IPAddress ip, out int startPort, out int endPort)
{
ip = null;
startPort = endPort = 0;
// 帮助命令
if (args.Length != 0 && (args[0] == "/?" || args[0] == "/h" || args[0] == "/help"))
{
Console.WriteLine("scan 192.168.1.10 100 2000");
return false;
}
if (args.Length == 3)
{
// 解析端口号成功
if (IPAddress.TryParse(args[0], out ip) && int.TryParse(args[1], out startPort) && int.TryParse(args[2], out endPort))
return true;
else
return false;
}
else
{
return false;
}
}
/// 端口 扫描
static void Scan(IPAddress ip, int startPort, int endPort)
{
Random rand = new Random((int)DateTime.Now.Ticks);
for (int port = startPort; port < endPort; port++)
{
Socket scanSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
//寻找一个未使用的端口进行绑定
do
{
try
{
scanSocket.Bind(new IPEndPoint(IPAddress.Any, rand.Next(65535)));
break;
}
catch
{
//绑定失败
}
} while (true);
try
{
scanSocket.BeginConnect(new IPEndPoint(ip, port), ScanCallBack, new ArrayList() { scanSocket, port });
}
catch
{
continue;
}
}
}
/// BeginConnect的回调函数 异步Connect的结果
static void ScanCallBack(IAsyncResult result)
{
// 解析 回调函数输入 参数
ArrayList arrList = (ArrayList)result.AsyncState;
Socket scanSocket = (Socket)arrList[0];
int port = (int)arrList[1];
// 判断端口是否开放
if (result.IsCompleted && scanSocket.Connected)
{
Console.WriteLine("端口: {0,5} 状态: Open", port);
}
scanSocket.Close();
}
}
}
C# 多线程与线程扫描器的更多相关文章
- C/C++ 实现多线程与线程同步
多线程中的线程同步可以使用,CreateThread,CreateMutex 互斥锁实现线程同步,通过临界区实现线程同步,Semaphore 基于信号实现线程同步,CreateEvent 事件对象的同 ...
- C#多线程之线程池篇3
在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...
- C#多线程之线程池篇2
在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...
- C#多线程之线程池篇1
在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...
- C#多线程之线程同步篇3
在上一篇C#多线程之线程同步篇2中,我们主要学习了AutoResetEvent构造.ManualResetEventSlim构造和CountdownEvent构造,在这一篇中,我们将学习Barrier ...
- C#多线程之线程同步篇2
在上一篇C#多线程之线程同步篇1中,我们主要学习了执行基本的原子操作.使用Mutex构造以及SemaphoreSlim构造,在这一篇中我们主要学习如何使用AutoResetEvent构造.Manual ...
- C#多线程之线程同步篇1
在多线程(线程同步)中,我们将学习多线程中操作共享资源的技术,学习到的知识点如下所示: 执行基本的原子操作 使用Mutex构造 使用SemaphoreSlim构造 使用AutoResetEvent构造 ...
- Java学习笔记-多线程-创建线程的方式
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
- Java多线程开发系列之四:玩转多线程(线程的控制1)
在前文中我们已经学习了:线程的基本情况.如何创建多线程.线程的生命周期.利用已有知识我们已经可以写出如何利用多线程处理大量任务这样简单的程序.但是当应用场景复杂时,我们还需要从管理控制入手,更好的操纵 ...
- iOS开发多线程篇—线程安全
iOS开发多线程篇—线程安全 一.多线程的安全隐患 资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块 ...
随机推荐
- 从数据链路到神秘的MAC地址和ARP协议
引言 链路是指从一个结点到相邻结点的一段物理线路.数据链路是在链路的基础上增加了一些必要的硬件和软件.这些硬件包括网络适配器,而软件则包括协议的实现.在网络中,主机.路由器等设备都必须实现数据链路层. ...
- 如果很好说出finalize用法,面试官会认为你很资深
我在面试Java候选人的时候,有时候会通过finalize问及候选人在JVM方面的技能,一般的问法是:你知不知道finalize方法,在项目里有没有重写过这个方法?在本文里就将详细来说下这个知识点. ...
- vite2.0+vue3.2部署Nginx 刷新404
vite2.9 + vue3.2 打包部署到nginx上刷新页面404问题 在本地运行没问题,部署到服务器上,能正常访问,但是刷新之后页面404 原有的Nginx配置为: server { liste ...
- 介绍几种OPTIONS检测的方法
概述 日常的VOIP开发中,OPTIONS检测是常用的网络状态检测工具. OPTIONS原本是作为获取对方能力的消息,也可以检测当前服务状态.正常情况下,UAS收到OPTIONS心跳,直接回复200即 ...
- mybatis plus 中增删改查及Wrapper的使用
本文为博主原创,未经允许不得转载: mybatis plus 通过封装 baseMapper 以及 ServiceImpl ,实现对数据库的增删改查操作,baseMapper 是我们通常所说的 da ...
- SD 控制器集成需求和寄存器列表
AHB Bus SD Bus DFT & Interrupt 控制集成需求 功能列表 控制器框架图 顶层信号 硬件集成环境 寄存器描述
- 【C/C++】sscanf函数和正则表达式
此文所有的实验都是基于下面的程序:char str[10];for (int i = 0; i < 10; i++) str[i] = '!';执行完后str的值为str = "!!! ...
- 2023第十四届极客大挑战 — RE WP
RE方向出自:队友. Shiftjmp 去花后按p然后再反编译 最后flag为SYC{W3lc0me_tO_th3_r3veR5e_w0r1d~} 点击就送的逆向题 gcc 1.s -o 1` 生成e ...
- Linux复习笔记
Linux复习笔记 常识说明 目录结构 Linux以树型结构管理文件,其最上层文件夹为 / ,也就是根目录. 如图所示,图中展示了一部分文件夹的结构: 所有的文件夹都属于根目录的子文件夹. 安装好系统 ...
- [转帖]Shell if 条件判断
Shell 语言中的if条件 一.if的基本语法: if [ command ];then 符合该条件执行的语句 elif [ command ];then 符合该条件执行的语句 e ...