C++ 实现端口扫描(转载)

第一、原理

端口扫描的原理很简单,就是建立socket通信,切换不通端口,通过connect函数,如果成功则代表端口开发者,否则端口关闭。

所有需要多socket程序熟悉,本内容是在window环境下的

第二、单线程实现方式

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

// PortScanf.cpp : 定义控制台应用程序的入口点。

//

#define WIN32_LEAN_AND_MEAN

#include "stdafx.h"

#include <WinSock2.h>

#pragma comment(lib, "Ws2_32")

int scant(char *Ip, int StartPort, int EndPort)

{  

    WSADATA wsa;

    SOCKET s;

    struct sockaddr_in server;

 

    int CurrPort;    //当前端口

    int ret;

 

    WSAStartup(MAKEWORD(2, 2), &wsa);    //使用winsock函数之前,必须用WSAStartup函数来装入并初始化动态连接库

 

    server.sin_family = AF_INET;    //指定地址格式,在winsock中只能使用AF_INET

    server.sin_addr.s_addr = inet_addr(Ip); //指定被扫描的IP地址

 

    for (CurrPort = StartPort; CurrPort <= EndPort; CurrPort++)

    {

        s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

        server.sin_port = htons(CurrPort); //指定被扫描IP地址的端口号

        ret = connect(s, (struct sockaddr *)&server, sizeof(server)); //连接

 

        if (0 == ret) //判断连接是否成功

        {

            printf("%s:%d Success O(∩_∩)O~~\n", Ip, CurrPort);

            closesocket(s);

        }

        else {

            printf("%s:%d Failed\n", Ip, CurrPort);

        }

    }  

    printf("Cost time:%f second\n", CostTime); //输出扫描过程中耗费的时间

    WSACleanup();    //释放动态连接库并释放被创建的套接字

    return 1;

}

 

int main()

{

    scant("127.0.0.1", 75, 100);

     

    return 0;

}

  

 

第三、多线程实现方式

由于单线程执行速度有些慢,我们加入多线程运行,

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

typedef struct _tagValue

{

    int start;

    int end;

}PortNums;

 

void _cdecl beginThreadFunc1(LPVOID lpParam) {

    PortNums *pnInt = (PortNums*)lpParam;

    scan("127.0.0.1", pnInt->start, pnInt->end);

}

 

int a()

{

    PortNums m1;

    m1.start = 70;

    m1.end = 500;

 

    PortNums m2;

    m2.start = 501;

    m2.end = 1000;

 

    _beginthread(beginThreadFunc1, 0, &m1);

    _beginthread(beginThreadFunc1, 0, &m2);

 

 

    getchar();

    return 0;

}

  注意需要#include<process.h>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值