多线程是一种复杂的编程技术,可以同时运行多个独立的线程来处理各种任务。在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# 多线程与线程扫描器的更多相关文章

  1. C/C++ 实现多线程与线程同步

    多线程中的线程同步可以使用,CreateThread,CreateMutex 互斥锁实现线程同步,通过临界区实现线程同步,Semaphore 基于信号实现线程同步,CreateEvent 事件对象的同 ...

  2. C#多线程之线程池篇3

    在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...

  3. C#多线程之线程池篇2

    在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...

  4. C#多线程之线程池篇1

    在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...

  5. C#多线程之线程同步篇3

    在上一篇C#多线程之线程同步篇2中,我们主要学习了AutoResetEvent构造.ManualResetEventSlim构造和CountdownEvent构造,在这一篇中,我们将学习Barrier ...

  6. C#多线程之线程同步篇2

    在上一篇C#多线程之线程同步篇1中,我们主要学习了执行基本的原子操作.使用Mutex构造以及SemaphoreSlim构造,在这一篇中我们主要学习如何使用AutoResetEvent构造.Manual ...

  7. C#多线程之线程同步篇1

    在多线程(线程同步)中,我们将学习多线程中操作共享资源的技术,学习到的知识点如下所示: 执行基本的原子操作 使用Mutex构造 使用SemaphoreSlim构造 使用AutoResetEvent构造 ...

  8. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

  9. Java多线程开发系列之四:玩转多线程(线程的控制1)

    在前文中我们已经学习了:线程的基本情况.如何创建多线程.线程的生命周期.利用已有知识我们已经可以写出如何利用多线程处理大量任务这样简单的程序.但是当应用场景复杂时,我们还需要从管理控制入手,更好的操纵 ...

  10. iOS开发多线程篇—线程安全

    iOS开发多线程篇—线程安全 一.多线程的安全隐患 资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块 ...

随机推荐

  1. 又强大了,LiteFlow里程碑版本2.8.0发版注记!全新的DSL会惊艳到你吗?

    一 New version! 2.8.0 go!!! 这是我在提交中央仓库前写下的简短description.我希望这个版本能把LiteFlow带向更远的地方. 曾经在半年前就计划的新的DSL计划,但 ...

  2. Java 使用 slf4j + log4j 写日志

    没有SpringBoot等框架的情况下 pom.xml: <properties> <slf4j.version>1.7.26</slf4j.version> &l ...

  3. Codeforces Round #618 (Div. 2) A~E

    原作者为 RioTian@cnblogs, 本作品采用 CC 4.0 BY 进行许可,转载请注明出处. 1300A. Non-zero 题意:给你一个数组,每次操作你可以使其中任意元素的值+1,问最少 ...

  4. AtCoder Beginner Contest 172 (C题前缀和 + 二分,D题筛因子,E题容斥定理)

    AB水题, C - Tsundoku 题目描述 有两摞书,一摞有 $n$ 本,从上至下每本需阅读 $a_i$ 分钟,一摞有 $m$ 本,从上至下每本需阅读 $b_i$ 分钟,问最多能在 $k$ 分钟内 ...

  5. 深入理解 Serverless 计算的并发度

    作者|西流(阿里云技术专家) 背景 2019 年 Berkeley 预测 Serverless 将取代 Serverful 计算[1],成为云计算的计算新范式.Serverless 为应用程序开发提供 ...

  6. slot-具名插槽

    定义组件:NamedSlot组件 <div class=""> <header> <slot name="header">& ...

  7. appium(三)使用方法

    一.appium环境搭建(先决条件) 1.安装JDk 2.安装SDK 参考文章:https://www.cnblogs.com/mrwhite2020/p/13160994.html 3.安装appn ...

  8. KVM 核心功能:CPU 虚拟化

    1 vCPU 简介 CPU 负责计算机程序指令的执行.QEMU-KVM 提供对虚拟机 CPU 的模拟,对于虚拟机来说,其拥有的 CPU 是真实的, 和物理 CPU 没有区别. 实际上,虚拟机在 hos ...

  9. 【Git】常用 Git 命令清单

    [来源]https://blog.csdn.net/hj7jay/article/details/53431717

  10. Vue- 绑定的图片不显示

    需要通过 require包裹 <template> <div> {{user.username}}: <img :src="user.avatar" ...