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, 客户端加密, 插件系统, 数据统计, 端口扫描, 网络工具