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, 云存储安全, 客户端加密, 插件系统, 数据统计, 端口扫描, 网络扫描