#include //printf函数要用的头文件
#include #include #include #include #include #include #include #include #include #include #include #include #include
void help(); //声明一个函数取名help,就是帮助函数
int main(int argc, char* argv[]) //主入口函数main()
{
//以下声明变量
//定义sockaddr_in结构
struct sockaddr_in sin;
int from_port; //开始端口
int to_port; //结束端口
int now_port; //正在扫描的端口
char* host; //要扫描的主机
int s; //保存创建socket时的返回值 其实就是个整数…
int open_port = 0; //开放端口个数
//如果命令行下参数不是4个(包括portscan.exe本身),提示正确的用法
if(argc != 4)
{
help(); //给出帮助
return -1;
}
//保存用户输入的要扫描的起始端口和结束端口
//由于用户输入的是char型,所以要先转成int型
from_port = atoi(argv[2]);
to_port = atoi(argv[3]);
host = argv[1];
//对用户输入的端口进行判断
if(from_port > to_port || from_port < 0 || from_port >65535 || to_port <0 || to_port >65535)
{
printf("起始端口不能大于结束端口,且范围为:1-65535!\n");
return 0;
}
printf("======= 开始扫描 =======\n");
//循环连结端口,以判断端口是否开放
for(now_port = from_port; now_port <= to_port; now_port++)
{
s = socket(AF_INET,SOCK_STREAM,0);
if(s < 0)
{
printf("创建socket()失败!\n");
}
//给结构成员赋值
sin.sin_family = AF_INET;
sin.sin_port = htons(now_port);
sin.sin_addr.s_addr = inet_addr(host);
//建立连结
if(connect(s,(struct sockaddr*)&sin,sizeof(sin)) < 0)
{
//printf("%s -> %d:未开放\n",host,now_port);
close(s);
}
else
{
printf("%s -> %d:开放\n",host,now_port);
open_port ++;
close(s);
}
}
printf("======= 扫描结果 =======\n");
printf("主机:%s 扫描到%d个端口开放\n",host,open_port);
//关闭socket
close(s);
return 0;
}
//以下为帮助函数内容
void help()
{
printf("Usage:\n");
printf(" portscan \n");
printf("Example:\n");
printf(" portscan 127.0.0.1 135 445\n");
}