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第一轮试题
...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
