根据提供的文件信息,我们可以分析出该段代码是一个命令行端口扫描工具的实现,主要功能是扫描指定IP地址范围内的开放端口,并显示扫描进度。接下来将从几个方面对该代码进行详细解读: ### 核心功能 - **端口扫描**:通过Winsock库来实现对目标主机指定端口的连接尝试,以此判断这些端口是否开放。 - **参数解析**:程序支持命令行参数输入,允许用户指定待扫描的IP地址或地址范围以及端口或端口范围。 ### 关键代码段解析 #### 主函数`main` ```c++ int main(int argc, char* argv[]) { // ... if((argc < 3) || (argc > 4)) { usage(argv[0]); return -1; } //... } ``` - **参数检查**:程序至少需要两个参数才能运行(程序名加上`-p`选项),最多四个参数(包括程序名、`-p`选项、起始IP或端口、结束IP或端口)。 - **命令行参数解析**:根据命令行输入的不同情况调用相应的函数进行处理。 - **初始化Winsock库**:使用`WSAStartup`函数初始化Winsock库,确保能够正常进行网络操作。 - **调用扫描函数**:`portscannow(argc)`用于执行端口扫描任务。 #### 命令行帮助信息 ```c++ void usage(char* prog) { printf("Usage: %s<Option>", prog); printf("\r\n<Option>:"); printf("\r\n-p[Port|StartPort-EndPort]<HostName|IP|StartIP-EndIP>"); printf("\r\n\nExample:"); // ... } ``` - **提供命令行使用指南**:说明如何正确地传递参数给程序,包括各种格式的示例。 #### 进度条显示 ```c++ void playx(int play = 0) { char* plays[12] = {...}; if (searchnum != 0) { for (int i = 0; i <= 3; i++) { printf("=%s=%d%sCompleted.\r", plays, searched * 100 / (searchnum + 1), "%"); Sleep(5); } } else { printf("=%s=\r", plays[play]); Sleep(10); } } ``` - **进度显示**:使用ASCII字符模拟进度条效果,每完成一定比例的扫描就会更新显示。 #### IP地址设置 ```c++ void setip2(char* cp) { int host; struct hostent* testhost; char* startip = "", *endip = ""; //... } ``` - **解析IP地址范围**:如果输入的是IP地址范围(例如“192.168.0.1-192.168.0.254”),则将起始和结束IP地址分别存储在`startip`和`endip`变量中。 #### 端口扫描 ```c++ void portscannow(int) { // 实现端口扫描逻辑 } ``` - **具体实现未给出**,但可以推测其主要功能是循环遍历所有待检测的IP地址和端口号,使用`connect`函数尝试与每个端口建立TCP连接,根据连接结果判断端口是否开放。 ### 总结 这段代码提供了一个基础的端口扫描工具实现,具有一定的实用价值。它通过命令行参数接收扫描目标的信息,并通过进度条实时反馈扫描进度。虽然部分核心功能的具体实现细节没有给出,但从整体结构上看,这是一段较为完整的端口扫描工具代码,对于学习网络编程和理解端口扫描原理有一定帮助。
#include <afxext.h>
#include <winsock.h>
// 编译时需使用的库
#pragma comment(lib,"wsock32.lib")
// select()成员定义
#define ZERO (fd_set *)0
// 变量定义
int maxth, scanok, scannum;
int portip, hoststart, hoststop, startport, endport; //定义了开始I和结束P地址,开始和结束端口
long searchnum, searched;
void usage(char *); // 定义显示使用方法函数
void playx(int); // 定义状态提示函数
void setip2(char *); // 定义设置IP函数
void customport(char *, char *, char *); // 定义自定义扫描端口函数
void portscannow(int); // 定义端口扫描扫描
// 主程序
int main(int argc, char *argv[])
{
WSADATA wsadata;
// 清屏
system("cls.exe");
// 显示版本信息
printf("\r\n==================== HUC Command Line PortScanner V0.2 ====================");
printf("\r\n=============== By Lion, Welcome to http://www.cnhonker.net ===============\r\n\n");
// 检查输入
if ((argc < 3) || (argc > 4))
{
usage(argv[0]);
return -1;
}
// 检测是否为port扫描
if(!(stricmp(strlwr(argv[1]), "-p") == 0))
{
usage(argv[0]);
return -1;
}
// 程序初始化
if (WSAStartup(MAKEWORD(1,1), &wsadata) != 0) //如果初始化错误
{
printf("\r\nWsatartup error"); //出错信息
return -1;
}
// 端口扫描参数转换
// 如果参数为三个
if (argc == 3)
{
// 直接设置IP
setip2(argv[2]);
}
// 如果参数为四个
else
if (argc == 4)
{
剩余15页未读,继续阅读
- 炳蔚19922015-08-16看了好几个版本的C,终于找到java的了
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助