hadakoi/netscan

GitHub: hadakoi/netscan

一个用 C 语言实现的轻量级 TCP 端口扫描器,通过线程池并发和 select 超时机制演示网络扫描的基础原理。

Stars: 0 | Forks: 0

# NetScan 一个使用 C 语言构建的轻量级 TCP 端口扫描器,演示了 socket 编程和使用线程池的并发编程概念。旨在作为理解 TCP 连接建立、超时、主机名解析和多线程网络服务发现的实用基础。 ## 快速开始 ``` gcc src/*.c -o netscan -lpthread ./netscan [threads] ``` ### 示例 ``` ./netscan 192.168.1.1 20-1024 ./netscan google.com 80-443 20 ./netscan localhost 1-65535 100 ``` | 参数 | 描述 | 默认值 | |---|---|---| | `host` | IPv4 地址或主机名 | — | | `port_range` | `start-end` 格式的范围(例如 `20-1024`) | — | | `threads` | 工作线程数 | 10 | ## 输出 ``` NetScan v1.0 Target: google.com (142.250.183.174) Ports: 78-85 Threads: 10 ───────────────────────────────────────── OPEN 80/tcp HTTP ───────────────────────────────────────── Scan Results ───────────────────────────────────────── Total ports scanned: 8 Open ports: 1 Scan duration: 2.01 seconds Discovered services: 80 HTTP ``` ## 架构 | 模块 | 文件 | 职责 | |---|---|---| | **main** | `src/main.c` | CLI 参数解析、验证、扫描编排 | | **network** | `src/network.h` `src/network.c` | 通过 `inet_aton`/`gethostbyname` 实现 `resolve_host()`,通过非阻塞 socket + `select()` 实现 `tcp_connect_port()` | | **scanner** | `src/scanner.h` `src/scanner.c` | 具有受互斥锁保护的工作计数器的线程池、按端口连接和结果收集 | | **services** | `src/services.h` `src/services.c` | 将约 130 个知名端口映射到 IANA 服务名称的静态查找表 | | **output** | `src/output.h` `src/output.c` | 实时开放端口显示和格式化的结果摘要 | ## 演示概念 | 概念 | 实现 | |---|---| | TCP socket | `socket()`、`connect()`、`struct sockaddr_in`、端口字节排序 | | 非阻塞 I/O | `O_NONBLOCK` + `select()` 用于可靠的按端口超时 | | DNS 解析 | `gethostbyname()` 用于主机名到 IP 的转换 | | 并发 | `pthread_create`/`pthread_join` — N 个工作线程从共享计数器中拉取端口 | | 同步 | `pthread_mutex_t` 保护工作计数器和开放端口列表 | | 计时 | `gettimeofday()` 用于测量扫描持续时间 | | 模块化设计 | 为网络、扫描、输出和服务映射提供独立的模块 | ## 构建说明 在 macOS (Darwin) 上编译和测试。需要 pthreads (`-lpthread`)。除了 POSIX socket 外无其他外部依赖。
标签:Socket编程, TCP/IP, 客户端加密, 插件系统, 数据统计, 端口扫描, 网络工具