C#实现端口扫描和执行cmd命令、调用摄像头
C#端口扫描
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Threading;namespace PortScanner
{class Program{static void Main(string[] args){// 设置扫描参数string host = "localhost";int startPort = 1;int endPort = 65535;int numThreads = 1000;// 创建线程池并开始扫描ThreadPool.SetMinThreads(numThreads, numThreads);List<WaitHandle> handles = new List<WaitHandle>();for (int port = startPort; port <= endPort; port++){handles.Add(new ManualResetEvent(false));ThreadPool.QueueUserWorkItem(CheckPort, new object[] { host, port, handles.Last() });}// 等待所有线程完成WaitHandle.WaitAll(handles.ToArray());Console.WriteLine("Scanning complete.");}static void CheckPort(object args){// 解析参数object[] parameters = (object[])args;string host = (string)parameters[0];int port = (int)parameters[1];ManualResetEvent handle = (ManualResetEvent)parameters[2];// 尝试连接端口try{using (TcpClient client = new TcpClient()){client.Connect(host, port);Console.WriteLine("Port {0} is open.", port);}}catch (Exception){// 端口未打开}// 通知主线程完成handle.Set();}}
}
使用方法:
- 打开 Visual Studio 或类似的 IDE
- 新建一个 C# 控制台应用程序
- 将上述代码复制粘贴到
Program.cs文件中 - 调整
host、startPort、endPort和numThreads等参数 - 在菜单中选择“生成”,然后选择“生成解决方案”
- 在菜单中选择“调试”,然后选择“调试 C# 程序”
- 程序将开始扫描指定主机的指定端口,输出开放的端口号
使用多线程可以提高 C# 端口扫描的速度。在上述代码中,我们使用了线程池来创建多个线程来扫描指定主机的端口。可以通过调整 numThreads 参数来控制线程池的大小。
同时,如果使用异步 I/O 操作来连接端口,也可以进一步提高扫描速度。可以使用 Socket.BeginConnect() 方法来启动异步连接,并使用 Socket.EndConnect() 方法来等待连接完成。
需要注意的是,使用多线程和异步 I/O 操作都会增加程序的复杂度。如果不正确地使用这些技术,可能会导致程序出现各种问题,例如竞态条件和死锁。因此,在使用这些技术的时候,请务必小心并仔细测试程序。
这个错误是由于同时创建的 WaitHandle 实例数超过了 64 个所导致的。
解决方法是使用更大的线程池,或将线程分批执行。例如,可以将端口分成几个范围,每个范围分配一个线程池,然后依次扫描每个范围。或者可以使用异步 I/O 操作来连接端口,这样可以避免创建过多的线程。
另外,需要注意的是,使用多线程和异步 I/O 操作都会增加程序的复杂度。如果不正确地使用这些技术,可能会导致程序出现各种问题,例如竞态条件和死锁。因此,在使用这些技术的时候,请务必小心并仔细测试程序。
using System;
using System.Diagnostics;namespace CmdExecution
{class Program{static void Main(string[] args){// 执行命令并输出结果string command = "dir";Process process = new Process();process.StartInfo.FileName = "cmd.exe";process.StartInfo.Arguments = "/c " + command;process.StartInfo.UseShellExecute = false;process.StartInfo.RedirectStandardOutput = true;process.Start();Console.WriteLine(process.StandardOutput.ReadToEnd());process.WaitForExit();}}
}
上述代码使用 C# 执行 cmd 命令,并将结果输出到控制台中。使用 Process.Start() 方法启动 cmd.exe 进程,并使用 /c 参数执行指定的命令。使用 Process.StandardOutput 属性获取命令输出,并使用 Console.WriteLine() 方法将输出写入控制台。
需要注意的是,使用此方法可以执行任意的 cmd 命令,包括危险的命令。因此,在实际应用中,需要对输入进行严格的验证和过滤,以确保系统安全。同时,也需要注意系统权限的限制,某些命令可能需要管理员权限才能执行。
以下是使用 C# 判断是否存在摄像头并打开摄像头的示例代码:
using System;
using System.Linq;
using System.Management;
using System.Runtime.InteropServices;
using System.Windows.Forms;namespace CameraExample
{class Program{[DllImport("avicap32.dll", EntryPoint = "capCreateCaptureWindowA")]private static extern IntPtr capCreateCaptureWindow(string lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hwndParent, int nID);[DllImport("user32.dll")]private static extern bool SetForegroundWindow(IntPtr hWnd);static void Main(string[] args){// 检查是否存在摄像头bool hasCamera = false;ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE Caption like '%Camera%'");foreach (ManagementObject device in searcher.Get()){hasCamera = true;break;}// 如果存在摄像头,则打开摄像头窗口if (hasCamera){IntPtr hwnd = capCreateCaptureWindow("Camera", 0, 0, 0, 640, 480, IntPtr.Zero, 0);SetForegroundWindow(hwnd);Application.Run();}else{Console.WriteLine("No camera found.");}}}
}
上述代码使用 WMI 查询来判断是否存在摄像头。如果存在摄像头,则使用 capCreateCaptureWindow() 函数创建摄像头窗口,并使用 SetForegroundWindow() 函数将窗口置于前台。最后,使用 Application.Run() 函数启动消息循环,以便用户可以操作摄像头窗口。如果不存在摄像头,则输出错误信息。
需要注意的是,使用此方法只能打开第一个摄像头并显示默认分辨率的图像。如果需要更多的摄像头支持和更高的图像质量,请使用专业的摄像头库或框架。同时,也需要注意系统权限的限制,某些操作可能需要管理员权限才能执行。
相关文章:
C#实现端口扫描和执行cmd命令、调用摄像头
C#端口扫描 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Threading;namespace PortScanner {class Program{static void Main(string[] args){// 设置扫描参数string host "localho…...
【图像恢复】基于交替乘子方法(ADMM)图像恢复算法研究[固定点收敛和应用](Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
Qt 使用QLabel的派生类实现QLabel的双击响应
1 介绍 在QLabel中没有双击等事件响应,需要构建其派生类,自定义信号(signals)、重载事件函数(event),最后在Qwidget中使用connect链接即可,进而实现响应功能。 对于其余没有需求事件响应的QObject同样适用。 此外,该功…...
关于@JSONField的使用
1.此注解来自jar包com.alibaba.fastjson 今天分享一个有意思的事情。这个注解作用与类的属性上,如下: ApiModelProperty(value"开始时间,格式:yyyy-MM-dd",required true) JSONField(name"start_date",ordinal 1) private String…...
Centos7单机部署ElasticSearch
Centos7单机部署ElasticSearch 引言 Elasticsearch是一种广泛使用的开源搜索引擎,专门为分布式环境设计,但也可以在单机上运行。它使存储、搜索和分析大量数据变得更加容易和高效。此教程将引导你通过在Centos7上单机部署Elasticsearch,涵盖…...
js玩儿爬虫
前言 提到爬虫可能大多都会想到python,其实爬虫的实现并不限制任何语言。 下面我们就使用js来实现,后端为express,前端为vue3。 实现功能 话不多说,先看结果: 这是项目链接:https://gitee.com/xi1213/w…...
新利好带动 POSE 持续上扬,月内几近翻倍
PoseiSwap 是 Nautilus Chain 上的首个 DEX,得益于 Nautilus Chain 的模块化 Layer3 构架,PoseiSwap 正在基于 zk-Rollup 方案构建全新的应用层,并基于此构建隐私、合规等全新的特性,为未来其布局 RWA 领域推动 Web2、Web3 世界的…...
Windows terminal 添加 git bash 解决git中文乱码显示问题
Windows terminal 添加 git bash 解决git中文乱码显示问题 在 windows terminal 中配置git 说明: 点击箭头选择设置 说明: 点击"添加新配置文件"配置名称命令行,可执行文件的具体语句 C:\Program Files\Git\bin\bash.exe启动目录…...
C语言实现选择排序
什么是选择排序? 选择排序是一种简单直观的排序算法,它的核心思想是每次从未排序的元素中选择最小(或最大)的元素,然后将其放到已排序序列的末尾。通过重复这个过程,直到所有元素都排好序为止。 选择排序…...
unable to write symref for HEAD: Permission denied
今天从gitee上面克隆项目到本地时报错如下 warning: unable to unlink ‘D:/IDEAcode/ruiji1.0/.git/HEAD.lock’: Invalid argument error: unable to write symref for HEAD: Permission denied 解决方法:将要存放项目的文件夹权限修改为完全控制 原先权限&…...
长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析等领域中的实践技术应用
植被是陆地生态系统中最重要的组分之一,也是对气候变化最敏感的组分,其在全球变化过程中起着重要作用,能够指示自然环境中的大气、水、土壤等成分的变化,其年际和季节性变化可以作为地球气候变化的重要指标。此外,由于…...
【行为型设计模式】C#设计模式之策略模式
题目:假设你正在开发一个手机应用程序,该应用程序包含一个计算器功能。用户可以根据自己的需求选择不同的计算策略进行计算,例如加法、减法、乘法或除法。请使用策略模式设计该计算器功能,使得用户可以根据自己的选择进行相应的计…...
Linux Shell 编程入门
从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。在Linux GUI日益完善的今天…...
Webstorm + Egg.js 进行断点调试
Webstorm Egg.js 进行断点调试 1、在工具栏找到编辑配置,创建已运行Node.js 应用程序的调试配置 2、debug调试配置 3、调试 4、查看断点是否起效...
Oracle-创建PDB
Oracle-创建PDB 创建PDB的方式 从PDB$SEED新建PDB克隆已存在的PDB 本地PDB克隆到同一个CDB中将远程PDB克隆到CDB中将非CDB插入或克隆到CDB中通过插拔的方式创建PDB sql 命令语法 条件 CDB必须open并且read write模式连接CDB$ROOT 用户并且具有CREATEPLUGGABLEDATABASE系统权…...
【TypeScript】交叉类型联合类型(四)
【TypeScript】交叉类型&联合类型(四) 【TypeScript】交叉类型&联合类型(四)一、简介二、交叉类型2.1 交叉类型使用的注意点2.2 基本数据类型交叉2.3 对象类型交叉 三、联合类型四、类型缩减 一、简介 TypeScript 中的交…...
数组和字符串-字符串
最长公共前缀 题意: 给多个字符串,找最长前缀 解: 暴力匹配,先按字典序排序字符串,这样长度短的优先进行匹配,所得字符串就可能偏小 适合a aa aaa aaaa这样的数据,不过对于aa aab aabc aab…...
MySQL-索引基础
文章概要 本篇文章通过几个问题来了解MySQL中索引相关的概念。平时在学习MySQL时或多或少都听说过索引的概念,但是索引到底是个什么东西,可能还不是非常的清楚。 正文 1. 什么是索引? 索引,在MySQL中也称为键(key),…...
CentOS中自动加载802.1q模块
CentOS中自动加载802.1q模块 要想在CentOS中自动加载内核模块,需要在/etc/sysconfig/modules/目录中增加一个脚本,在此脚本中加载所需的模块。 下面是我所用的一个名为8021q.modules的脚本,用来在我的CentOS 5.3中自动加载802.1Q模块&#…...
CSP-J2022第一轮试题
...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...
【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...
