varun6532/TCP-Port-Scanner-
GitHub: varun6532/TCP-Port-Scanner-
一个基于 C 语言和 POSIX 多线程的 TCP 端口扫描器,用于探测目标主机上指定端口范围内 TCP 端口的开放状态。
Stars: 0 | Forks: 0
# TCP Connect 端口扫描器
一个使用 C 语言编写的多线程 TCP Connect 端口扫描器,用于扫描目标主机上的指定 TCP 端口范围,以判断它们是开放还是关闭的。该扫描器使用 POSIX sockets 进行网络通信,使用 POSIX 线程(`pthreads`)进行并发扫描,并使用 `gethostbyname()` 进行 DNS 解析,以便在尝试 TCP 连接之前解析主机名。
本项目是一个为了学习而构建的练习,旨在深入理解 Linux 中的底层网络原理、socket 编程、多线程处理以及 TCP 通信。
## 功能特性
- 扫描自定义的 TCP 端口范围
- 使用 POSIX 线程(`pthreads`)进行多线程扫描
- 同时支持主机名和 IPv4 地址
- 使用 `gethostbyname()` 解析主机名
- 扫描前显示解析出的 IP 地址
- 使用 TCP `connect()` 判断端口是否开放
- 可配置的 socket 超时时间
- 使用 POSIX sockets 实现的轻量级架构
## 使用的技术
- C
- GCC
- Linux
- POSIX Socket API
- POSIX Threads (pthreads)
- TCP/IP 网络
## 项目结构
```
tcp_port_scanner.c
```
## 编译
使用 GCC 并开启 pthread 支持进行编译:
```
gcc tcp_port_scanner.c -o tcp_port_scanner.out -pthread
```
## 用法
```
./tcp_port_scanner.out
```
### 示例
```
./tcp_port_scanner.out scanme.nmap.org 20 100
```
## 输出示例
```
Beginning the scan!
Hostname: scanme.nmap.org
IP: 45.33.xxx.xxx
Port:22 is up...
Port:80 is up...
Port:53 is up...
Scan Complete
```
## 工作原理
1. 从命令行接收主机名/IP 地址和端口范围。
2. 使用 `gethostbyname()` 解析主机名。
3. 将指定的端口范围划分为四个相等的块。
4. 使用 `pthread_create()` 创建四个工作线程。
5. 每个线程独立扫描其被分配的范围。
6. 对于每个端口:
- 创建一个 TCP socket。
- 设置 socket 的发送/接收超时时间。
- 使用 `connect()` 尝试建立 TCP 连接。
- 报告该端口是否处于开放状态。
7. 主线程使用 `pthread_join()` 等待所有工作线程完成。
8. 当所有线程完成时,打印 **"Scan Complete"**。
## 多线程
为了提高扫描速度,扫描器将目标端口范围划分为四个相等的部分。
每个部分被分配给一个单独的线程,从而允许同时进行多个连接尝试。
示例:
```
Ports 1–100
Thread 1 → 1–25
Thread 2 → 26–50
Thread 3 → 51–75
Thread 4 → 76–100
```
与顺序扫描相比,这显著减少了整体扫描时间。
## 实践的概念
- Socket 编程
- TCP/IP 网络
- POSIX 线程(`pthread_create`, `pthread_join`)
- DNS 解析
- `gethostbyname()`
- `sockaddr_in`
- `connect()`
- `socket()`
- Socket 超时(`setsockopt()`)
- 网络字节序(`htons()`)
- 内存复制(`memcpy()`)
- 命令行参数
## 局限性
目前,该扫描器:
- 仅支持 IPv4
- 使用固定的线程数量(4 个线程)
- 仅能检测 TCP 端口是否开放
- 无法识别正在运行的服务
- 不执行 banner grabbing
- 不支持 UDP 扫描
## 未来改进
- 可配置的线程数量
- 使用 `getaddrinfo()` 支持 IPv6
- 服务检测
- Banner grabbing
- UDP 端口扫描
- 自定义超时值
- 更好的命令行参数解析
- 将结果导出为 CSV 或 JSON
- 进度指示器
- 使用 `Ctrl+C` 进行优雅中断
## 免责声明
本项目仅供教育目的使用。
仅扫描您自己拥有或已获得明确授权许可测试的系统。
未经授权的端口扫描可能会违反法律或网络政策。
## 作者
**Varun Singh**
GitHub: https://github.com/varun6532
标签:POSIX Sockets, 客户端加密, 插件系统, 数据统计, 端口扫描, 网络安全, 网络编程, 隐私保护