zoukankan      html  css  js  c++  java
  • 扫描指定ip的端口(C#)

        class PingExam
        {
            public static void Main()
            {
                Ping ping = new Ping();
                string ip = "192.168.1.43"; // 目标ip
                int[] ports = { 20, 21, 25, 80, 8080, 2588 }; // 需要扫描的端口
                scanPort(IPAddress.Parse(ip), ports);
            }
    
    
            private static void scanPort(IPAddress address, int startPort, int endPort)
            {
                int[] ports = new int[endPort - startPort + 1];
                for (int i = 0; i < endPort-startPort+1; i++) {
                    ports[i] = startPort + i;
                }
                scanPort(address, ports);
            }
    
    
            private static void scanPort(IPAddress address, int[] ports)
            {
                try {
                    int count = ports.Length;
                    AutoResetEvent[] arEvents = new AutoResetEvent[count]; // 同步对象
                    for (int i = 0; i < count; i++) {
                        arEvents[i] = new AutoResetEvent(false); // 同步对象, 初始未触发
                        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                        socket.Bind(new IPEndPoint(IPAddress.Any, 0));
                        socket.BeginConnect(new IPEndPoint(address, ports[i]), 
                            callback, 
                            new ArrayList() { socket, ports[i], arEvents[i]} // 传递3个参数: 当前socket, 端口, 同步对象
                            );
                    }
    
                    WaitHandle.WaitAll(arEvents); // 等待所有扫描工作完成
                }
                catch (Exception ex) {
                    Console.WriteLine(ex.Message);
                }
            }
    
            private static void callback(IAsyncResult ar) // 扫描完成后的回调方法
            {
                ArrayList list = (ArrayList)ar.AsyncState; // 获取传递的参数
                Socket socket = (Socket)list[0];
                int port = (int)list[1];
                AutoResetEvent arevent = (AutoResetEvent)list[2];
    
                if (ar.IsCompleted && socket.Connected) {
                    Console.WriteLine("port: {0} open.", port); // 检查 connected属性, 如果为true 则表示是开放的
                }
                else {
                    Console.WriteLine("port: {0} closed.", port);
                }
                try {
                    socket.Shutdown(SocketShutdown.Both);
                    socket.Close();
                }
                catch {
                }
                arevent.Set(); // 完成后触发
            }
        }
  • 相关阅读:
    windows命令行下导入excel数据到SQLite数据库
    Android Studio如何提示函数用法
    在不root手机的情况上读取Data目录上的文件
    OSI七层模型
    设计模式之代理模式
    Android中Javascript中的调用
    cf #205 B Codeforces Round #205 (Div. 2) B. Two Heaps
    uva 10600 次小生成树
    防2B && 图论模板 && 7788
    最大匹配 && 最佳完美匹配 模板
  • 原文地址:https://www.cnblogs.com/csMapx/p/3336233.html
Copyright © 2011-2022 走看看