Dlewis89/Nscanner
GitHub: Dlewis89/Nscanner
一个基于 C 语言和原生 socket API 实现的轻量级 Linux TCP 端口扫描器,帮助用户检测目标主机上指定范围内的开放端口。
Stars: 0 | Forks: 0
# 网络扫描器
## 概述
该扫描器尝试与用户定义范围内的每个端口建立 TCP 连接。如果连接成功,则报告该端口为开放状态。
本项目特意不使用外部网络库进行编写,旨在更深入地理解 socket 和 Linux 网络 API。
## 功能
- 扫描 IPv4 地址
- 自定义起始和结束端口范围
- 检测开放的 TCP 端口
- 简单的命令行界面
- 使用头文件和源文件的模块化项目结构
## 项目结构
```
network-scanner/
├── include/
│ └── scanner.h
├── src/
│ ├── main.c
│ └── scanner.c
├── README.md
└── Makefile
```
## 构建
```
gcc -std=c17 -Wall -Wextra -Wpedantic -Iinclude -o nscanner src/main.c src/scanner.c
```
## 用法
扫描 localhost:
```
./nscanner
```
扫描其他主机:
```
./nscanner 192.168.1.100
```
扫描特定范围:
```
./nscanner 127.0.0.1 1 1024
```
## 我的收获
在这个项目中,我学到了:
- 使用 `socket()` 创建 TCP socket
- 使用 `connect()` 连接到远程主机
- 使用 `struct sockaddr_in`
- 使用 `inet_pton()` 转换 IPv4 地址
- 使用 `htons()` 转换端口
- 使用 `perror()` 和 `errno` 进行错误处理
- 阅读 Linux man 手册
- 通过指针传递结构体
- 将接口 (`.h`) 与实现 (`.c`) 分离
- C 语言中的基本项目组织
## 挑战
构建此项目时遇到的一些挑战包括:
- 理解指向结构体的指针
- 学习 `.` 和 `->` 之间的区别
- 正确地将结构体传递给 `connect()`
- 在显示扫描进度时处理终端输出
- 解析命令行参数
- 将项目组织成多个源文件
## 未来改进
- 使用 `getaddrinfo()` 支持 hostname
- 可配置的连接超时
- 使用线程进行并行扫描
- 支持 IPv6
- 更好的进度报告
- 服务检测
## 许可证
MIT
标签:Linux网络编程, Socket编程, TCP, 云存储安全, 客户端加密, 插件系统, 数据统计, 端口扫描, 网络扫描