扫端口的

该博客展示了一个用C++编写的简单端口扫描器NetxPort。它可进行常用端口扫描、自定义端口扫描、多主机常用端口扫描和多主机自定义端口扫描。通过Winsock库实现网络连接,利用socket和struct等技术,判断目标主机端口是否开放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前些日子,偶开始学Socket,在云舒的大力帮助之一,偶写了一个单线程单主机的端口扫描器,今天想改为扫多主机的,(线程还是单的,慢得要命,不过偶是作为学习用的,慢也没关系),可是不会改了,请大家指点我一下

/*
  Name: NetxPort
  Copyright: Netxfly
  Author: Netxfly
  Date: 12-10-04
  Description: A simple Port scanner
*/

#include <stdio.h>
#include <string.h>
#include <winsock2.h>

#pragma comment(lib,"ws2_32.lib")

void usage(char *);     //帮助函数 
void scan(char *);    //常用端口扫描 
void scan1(char *,char *, char *);    //自定义端口扫描   
void scan2(char *, char *2);   //多主机常用端口扫描   
void scan3(char *, char *, char *, char *);
//多主机自定义端口扫描   

//////////////////////////////////////////////////////////////////
//主函数
//////////////////////////////////////////////////////////////////
int main(int argc,char *argv[])
{
    if(argc==2)
    {
        scan(argv[1]);      //常用端口扫描  
    } 
    else if(argc==3)        //多主机常用端口扫描    
    {
        scan2(argv[1],argv[2]);    
    } 
    else if(argc==4)
    {
        scan1(argv[1],argv[2],argv[3]);     //自定义端口扫描    
    }   
    else if(argc==5)
    {
        scan3(argv[1],argv[2],argv[3],argv[4]);   //多主机自定义端口扫描         
    }  
    else
    {
        usage(argv[0]);
    }        
   
}   
/////////////////////////////////////////////////////////////////////////
//帮助函数  void usage(char *help)
/////////////////////////////////////////////////////////////////////////

void usage(char *help)
{
 printf("====================================================================/n");
 printf("NetxPort Version 1.0 by Netxfly  12-10-2004 /n");
 printf("Welcome to visit
http://netxfly.126.com/n");
 printf("Usage:/n");
 printf("%s <target>/t/t/t/t常用端口扫描/n",help);
 printf("%s <target> <port1> <port2>/t/t自定义端口扫描/n",help);
 printf("%s <target1> <target2>/t/t/t多主机常用端口扫描/n",help);
 printf("%s <target1> <target2> <port1> <port2>/t多主机自定义端口扫描/n",help);
 printf("====================================================================/n");
 return ;
}
////////////////////////////////////////////////////////////////////////////
//常用端口扫描  void scan(char *target)
////////////////////////////////////////////////////////////////////////////
void scan(char *target)
{
    WSADATA         wsadata;
    SOCKET          netxfly;
    int             i;
    struct sockaddr_in server;
    int ports[12] = {21,23,25,53,80,110,135,139,445,1433,3306,3389};
    if(WSAStartup(MAKEWORD(2,2),&wsadata)!=0)
        {
                printf("Startup Winsock Failed.../n");
                exit(-1);
        }
    for(i=0;i<12;i++)
    {
        if((netxfly = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET)
        {
                printf("Create Socket Err.../r/n");
                exit(-1);
        }

        server.sin_family=AF_INET;
        server.sin_addr.s_addr=inet_addr(target);
        server.sin_port = htons(ports[i]);
        if(connect(netxfly,(struct sockaddr*)&server,sizeof(server)) != SOCKET_ERROR)
        {
            printf("port %d is open at Host:%s/r/n",ports[i],target);
            closesocket(netxfly);
        } 
        else
        {
            closesocket(netxfly);
        }
    }   
   WSACleanup(); 
}
////////////////////////////////////////////////////////////////////////////
//自定义端口扫描    void scan1(char *target,char *start, char *end)
////////////////////////////////////////////////////////////////////////////  

void scan1(char *target,char *start, char *end)
{
    WSADATA         wsadata;
    SOCKET          netxfly;
    int             i;
    int             port1;
    int             port2;
    struct sockaddr_in server;
    if(WSAStartup(MAKEWORD(2,2),&wsadata)!=0)
        {
                printf("Startup Winsock Failed.../n");
                exit(-1);
        }
    port1=atoi(start);
    port2=atoi(end);   
    for(i=port1;i<=port2;i++)
    {
        if((netxfly = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET)
        {
                printf("Create Socket Err.../r/n");
                exit(-1);
        }

        server.sin_family=AF_INET;
        server.sin_addr.s_addr=inet_addr(target);
        server.sin_port = htons(i);
        if(connect(netxfly,(struct sockaddr*)&server,sizeof(server)) != SOCKET_ERROR)
        {
            printf("port %d is open at Host:%s/r/n",i,target);
            closesocket(netxfly);
        } 
        else
        {
            closesocket(netxfly);
        }
    }    
WSACleanup();
}  

///////////////////////////////////////////////////////////////////////////
//多主机常用端口扫描     void scan2(char *target1, char *target2)
///////////////////////////////////////////////////////////////////////////
void scan2(char *target1, char *target2)
{
   
    unsigned long             i;
    unsigned long             start1;
    unsigned long             start2;
    char                      *target;
    start1=ntohl(inet_addr(target1));       //Ascll->Network->Host
    start2=ntohl(inet_addr(target2));       //Ascll->Network->Host
    for(i=start1;i<=start2;i++)
    {
        target=inet_ntoa(htonl(i));         //host->network->Ascii       
    //由主机顺序->网络顺序->字符点格式,让scan()调用
        scan(target);
    }   
}

////////////////////////////////////////////////////////////////////////////
//多主机自定义端口扫描  
//void scan3(char *target, char *target2, char *start, char *end)
///////////////////////////////////////////////////////////////////////////

void scan3(char *target, char *target2, char *start, char *end)
{
   



在我在Blog中可以更好看清楚代码
http://www.blogbus.com/blogbus/blog...?diaryid=536479
PS:我是在网吧写的,没有VC,用的是dev c++和Lcc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值