剛開始學習使用C++ BOOST庫,用BOOST ASIO網絡庫寫的一個簡單command-line掃描器,原理是調用boost::asio::ip::tcp::socket類的connect成員函數連接目標主機及要掃描的(TCP)端口。函數返回boost::system::error_code類型對象ec,ec對象(通過boost::system::error_code類的轉換函數)可轉換成bool類型值。用語句if(ec)進行判斷,當端口打開connect成功,ec==false;端口關閉connect失敗,ec==true。
connect函數原型:
void connect(
const endpoint_type & peer_endpoint);
boost::system::error_code connect(
const endpoint_type & peer_endpoint,
boost::system::error_code & ec);
1
#include <boost/asio.hpp>
2
#include <iostream>
3
#include <cstdlib>
4
#include <vector>
5
6
using boost::asio::ip::tcp;
7
using std::vector;
8
9
static inline void print_port(int i);
10
static inline void print_port(int i,bool if_print_port_closed);
11
static vector<char const*>& std_split(char* const str);
12
unsigned short scaner(tcp::socket &s,tcp::resolver &r,char const *h,char const *p);
13
14
bool if_has_underline=false;
15
16
int main(int argc,char* argv[])
17

{
18
std::cout<<"****** Tcp Detect by www.shnenglu.com/jerry @ 7/21/2009 ******"<<std::endl;
19
if(argc!=3)
20

{
21
std::cout<<"Usage: "<<argv[0]<<" <hostname> <port>"<<std::endl;
22
std::cout<<"eg: "<<std::endl;
23
std::cout<<" "<<argv[0]<<" 192.168.12.115 110-140"<<std::endl;
24
std::cout<<" "<<argv[0]<<" 192.168.12.115 21,22,23,25,80"<<std::endl;
25
return 1;
26
}
27
28
try
29

{
30
int port=0;
31
vector<char const*> &i_ptr=std_split(argv[2]);
32
char const *max_port="65535";
33
34
boost::asio::io_service io_service;
35
tcp::resolver resolver(io_service);
36
tcp::socket socket(io_service);
37
if(i_ptr.size()>0)
38
{
39
if(!if_has_underline)
40
{
41
for(int i=0;i<i_ptr.size();++i)
42
{
43
if(atoi(i_ptr[i])>65535 || atoi(i_ptr[i])<=0) i_ptr[i]=max_port;
44
port=scaner(socket,resolver,argv[1],i_ptr[i]);
45
if(port)
46
print_port(port);
47
else
48
print_port(atoi(i_ptr[i]),1);
49
}
50
}
51
else
52
{
53
int p=atoi(i_ptr[0]),p1=atoi(i_ptr[1]),tmp=0;
54
char str[6];
55
if(p>65535 || p<=0) p=65535;
56
if(p1>65535 || p1<0) p1=65535;
57
if(p>p1)
58
{
59
tmp=p;
60
p=p1;
61
p1=tmp;
62
}
63
for(int i=p;i<=p1;++i)
64
{
65
port=scaner(socket,resolver,argv[1],itoa(i,str,10));
66
if(port)
67
print_port(port);
68
else
69
print_port(i,1);
70
}
71
}
72
}
73
}
74
catch(std::exception &e)
75

{
76
std::cout<<e.what()<<std::endl;
77
return -1;
78
}
79
80
return 0;
81
}
82
83
static inline void print_port(int i)
84

{
85
std::cout<<i<<"\topened\t=====> good!"<<std::endl;
86
}
87
static inline void print_port(int i,bool if_print_port_closed)
88

{
89
if(if_print_port_closed)
90
std::cout<<i<<"\tclosed"<<std::endl;
91
else
92
std::cout<<i<<"\topened\t=====> good!"<<std::endl;
93
}
94
95
static vector<char const*>& std_split(char* const str)
96

{
97
//static char flag[5]="flag";
98
vector<char const*>* char_ptr_vec=new vector<char const*>();
99
unsigned count=0,length=strlen(str);
100
for(int i=0;i<length;++i)
101

{
102
if(*(str+i)==',')
103
{
104
*(str+i)=0;
105
char_ptr_vec->push_back(str+count);
106
count=i+1;
107
}
108
else if(*(str+i)=='-')
109
{
110
*(str+i)=0;
111
char_ptr_vec->push_back(str);
112
count=i+1;
113
char_ptr_vec->push_back(str+count);
114
if_has_underline=true;
115
//push the third element as a flag
116
//char_ptr_vec->push_back(flag);
117
break;
118
}
119
}
120
121
//if(count==0) char_ptr_vec.push_back(str);
122
char_ptr_vec->push_back(str+count);
123
return *char_ptr_vec;
124
}
125
126
unsigned short scaner(tcp::socket &s,tcp::resolver &r,char const *h,char const *p)
127

{
128
try
129

{
130
tcp::resolver::query query(h,p);
131
tcp::resolver::iterator endpoint_iterator=r.resolve(query);
132
tcp::resolver::iterator end;
133
boost::system::error_code error=boost::asio::error::host_not_found;
134
135
while(error && endpoint_iterator!=end)
136
{
137
s.close();
138
s.connect(*endpoint_iterator++,error);
139
}
140
if(error)
141
{
142
return 0;
143
//throw boost::system::error_code(error);
144
}
145
}
146
catch(std::exception &e)
147

{
148
std::cout<<e.what()<<std::endl;
149
return 0;
150
}
151
152
return atoi(p);
153
}

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

47

48

49

50

51

52



53

54

55

56

57

58



59

60

61

62

63

64



65

66

67

68

69

70

71

72

73

74

75



76

77

78

79

80

81

82

83

84



85

86

87

88



89

90

91

92

93

94

95

96



97

98

99

100

101



102

103



104

105

106

107

108

109



110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127



128

129



130

131

132

133

134

135

136



137

138

139

140

141



142

143

144

145

146

147



148

149

150

151

152

153
