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, 客户端加密, 插件系统, 数据统计, 端口扫描, 网络安全, 网络编程, 隐私保护