多线程是一种复杂的编程技术,可以同时运行多个独立的线程来处理各种任务。在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. KVM--基本管理

    #!/bin/bash iso=/iso/CentOS-7-x86_64-Minimal-1708.iso #本机镜像文件位置 centos=centos7.0 #操作系统版本 disk_path=/ ...

  2. Windows线程开发

    Windows线程开发 1.线程基础 Windows线程是可以执行的代码实例.系统十一线程为单位调度程序.一个程序当中可以有多个线程,实现多个任务的处理. Windows线程的特点: 线程都具有1个I ...

  3. L2-030 冰岛人 (25 分) (阅读理解)

    补题链接:Here 2018年世界杯,冰岛队因1:1平了强大的阿根廷队而一战成名.好事者发现冰岛人的名字后面似乎都有个"松"(son),于是有网友科普如下: 冰岛人沿用的是维京人古 ...

  4. L3-001. 凑零钱-PAT团体程序设计天梯赛GPLT(01背包,动态规划)

    韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有 104 枚来自各个星球的硬币,需要请你帮她盘算一下 ...

  5. Java面试——数据库知识点

    MySQL 1.建 主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合.一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null). 超键:在关系中能唯一标识元组的属性 ...

  6. 从输入URL后浏览器的渲染逻辑

    从输入URL到浏览器渲染页面需要经过很多过程,本文简单说明下各个环节的内容 主要渲染节点如下: 一.浏览器进程说明 出于安全考虑,打开一个浏览器的Tab页签,会生成1个浏览器主进程.1个网络进程.1个 ...

  7. 机器学习-无监督机器学习-kmeans衍生的算法-18

    目录 1. k-Medoids 2. 二分KMEANS 3. KMeans++ 4. elkan KMeans 5. min batch KMeans算法 6.小结: 1. k-Medoids 之前的 ...

  8. Linux进阶命令-grep

    Linux进阶命令----grep 目录 Linux进阶命令----grep grep 命令介绍 grep命令格式 常用选项 模式部分 匹配字符: 匹配次数: 位置锚定: grep 命令介绍 Linu ...

  9. phpcms - 在删除文章后实现自动删除tag标签

    在使用phpcms程序制作网站的时候,我们会发现文章模型新建一篇文章后会自动向数据库中插入关键词,但如果删除文章后,数据库中的关键词表中字段中还存在之前文章的关键词,那么怎样才能在phpcms后台中删 ...

  10. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.21)

    一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...