第一、原理
端口扫描的原理很简单,就是建立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>
以上这篇c++ 端口扫描程序实现案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。