src/​examples/​cpp03/​socks4/​socks4.​hppsrc/​examples/​cpp11/​socks4/​socks4.​hpp
⋮⋮
1 /​/​1 /​/​
2 /​/​·​socks4.​hpp2 /​/​·​socks4.​hpp
3 /​/​·​~~~~~~~~~~3 /​/​·​~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2020·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2020·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #ifndef·​SOCKS4_HPP11 #ifndef·​SOCKS4_HPP
12 #define·​SOCKS4_HPP12 #define·​SOCKS4_HPP
13 13
14 #include·​<array>
14 #include·​<string>15 #include·​<string>
15 #include·​<asio.​hpp>16 #include·​<asio/​buffer.​hpp>
16 #include·​<boost/​array.​hpp>17 #include·​<asio/​ip/​tcp.​hpp>
17 18
18 namespace·​socks4·​{19 namespace·​socks4·​{
19 20
20 const·​unsigned·​char·​version·​=·​0x04;​21 const·​unsigned·​char·​version·​=·​0x04;​
21 22
22 class·​request23 class·​request
23 {24 {
24 public:​25 public:​
25 ·​·​enum·​command_type26 ·​·​enum·​command_type
26 ·​·​{27 ·​·​{
27 ·​·​·​·​connect·​=·​0x01,​28 ·​·​·​·​connect·​=·​0x01,​
28 ·​·​·​·​bind·​=·​0x0229 ·​·​·​·​bind·​=·​0x02
29 ·​·​};​30 ·​·​};​
30 31
31 ·​·​request(command_type·​cmd,​·​const·​asio:​:​ip:​:​tcp:​:​endpoint&·​endpoint,​32 ·​·​request(command_type·​cmd,​·​const·​asio:​:​ip:​:​tcp:​:​endpoint&·​endpoint,​
32 ·​·​·​·​·​·​const·​std:​:​string&·​user_id)​33 ·​·​·​·​·​·​const·​std:​:​string&·​user_id)​
33 ·​·​·​·​:​·​version_(version)​,​34 ·​·​·​·​:​·​version_(version)​,​
34 ·​·​·​·​·​·​command_(cmd)​,​35 ·​·​·​·​·​·​command_(cmd)​,​
35 ·​·​·​·​·​·​user_id_(user_id)​,​36 ·​·​·​·​·​·​user_id_(user_id)​,​
36 ·​·​·​·​·​·​null_byte_(0)​37 ·​·​·​·​·​·​null_byte_(0)​
37 ·​·​{38 ·​·​{
38 ·​·​·​·​/​/​·​Only·​IPv4·​is·​supported·​by·​the·​SOCKS·​4·​protocol.​39 ·​·​·​·​/​/​·​Only·​IPv4·​is·​supported·​by·​the·​SOCKS·​4·​protocol.​
39 ·​·​·​·​if·​(endpoint.​protocol()​·​!=·​asio:​:​ip:​:​tcp:​:​v4()​)​40 ·​·​·​·​if·​(endpoint.​protocol()​·​!=·​asio:​:​ip:​:​tcp:​:​v4()​)​
40 ·​·​·​·​{41 ·​·​·​·​{
41 ·​·​·​·​·​·​throw·​asio:​:​system_error(42 ·​·​·​·​·​·​throw·​asio:​:​system_error(
42 ·​·​·​·​·​·​·​·​·​·​asio:​:​error:​:​address_family_not_su​pported)​;​43 ·​·​·​·​·​·​·​·​·​·​asio:​:​error:​:​address_family_not_su​pported)​;​
43 ·​·​·​·​}44 ·​·​·​·​}
44 45
45 ·​·​·​·​/​/​·​Convert·​port·​number·​to·​network·​byte·​order.​46 ·​·​·​·​/​/​·​Convert·​port·​number·​to·​network·​byte·​order.​
46 ·​·​·​·​unsigned·​short·​port·​=·​endpoint.​port()​;​47 ·​·​·​·​unsigned·​short·​port·​=·​endpoint.​port()​;​
47 ·​·​·​·​port_high_byte_·​=·​(port·​>>·​8)​·​&·​0xff;​48 ·​·​·​·​port_high_byte_·​=·​(port·​>>·​8)​·​&·​0xff;​
48 ·​·​·​·​port_low_byte_·​=·​port·​&·​0xff;​49 ·​·​·​·​port_low_byte_·​=·​port·​&·​0xff;​
49 50
50 ·​·​·​·​/​/​·​Save·​IP·​address·​in·​network·​byte·​order.​51 ·​·​·​·​/​/​·​Save·​IP·​address·​in·​network·​byte·​order.​
51 ·​·​·​·​address_·​=·​endpoint.​address()​.​to_v4()​.​to_bytes()​;​52 ·​·​·​·​address_·​=·​endpoint.​address()​.​to_v4()​.​to_bytes()​;​
52 ·​·​}53 ·​·​}
53 54
54 ·​·​boost:​:​array<asio:​:​const_buffer,​·​7>·​buffers()​·​const55 ·​·​std:​:​array<asio:​:​const_buffer,​·​7>·​buffers()​·​const
55 ·​·​{56 ·​·​{
56 ·​·​·​·​boost:​:​array<asio:​:​const_buffer,​·​7>·​bufs·​=57 ·​·​·​·​return
57 ·​·​·​·​{58 ·​·​·​·​{
58 ·​·​·​·​·​·​{59 ·​·​·​·​·​·​{
59 ·​·​·​·​·​·​·​·​asio:​:​buffer(&version_,​·​1)​,​60 ·​·​·​·​·​·​·​·​asio:​:​buffer(&version_,​·​1)​,​
60 ·​·​·​·​·​·​·​·​asio:​:​buffer(&command_,​·​1)​,​61 ·​·​·​·​·​·​·​·​asio:​:​buffer(&command_,​·​1)​,​
61 ·​·​·​·​·​·​·​·​asio:​:​buffer(&port_high_byt​e_,​·​1)​,​62 ·​·​·​·​·​·​·​·​asio:​:​buffer(&port_high_byt​e_,​·​1)​,​
62 ·​·​·​·​·​·​·​·​asio:​:​buffer(&port_low_byte​_,​·​1)​,​63 ·​·​·​·​·​·​·​·​asio:​:​buffer(&port_low_byte​_,​·​1)​,​
63 ·​·​·​·​·​·​·​·​asio:​:​buffer(address_)​,​64 ·​·​·​·​·​·​·​·​asio:​:​buffer(address_)​,​
64 ·​·​·​·​·​·​·​·​asio:​:​buffer(user_id_)​,​65 ·​·​·​·​·​·​·​·​asio:​:​buffer(user_id_)​,​
65 ·​·​·​·​·​·​·​·​asio:​:​buffer(&null_byte_,​·​1)​66 ·​·​·​·​·​·​·​·​asio:​:​buffer(&null_byte_,​·​1)​
66 ·​·​·​·​·​·​}67 ·​·​·​·​·​·​}
67 ·​·​·​·​};​68 ·​·​·​·​};​
68 ·​·​·​·​return·​bufs;​
69 ·​·​}69 ·​·​}
70 70
71 private:​71 private:​
72 ·​·​unsigned·​char·​version_;​72 ·​·​unsigned·​char·​version_;​
73 ·​·​unsigned·​char·​command_;​73 ·​·​unsigned·​char·​command_;​
74 ·​·​unsigned·​char·​port_high_byte_;​74 ·​·​unsigned·​char·​port_high_byte_;​
75 ·​·​unsigned·​char·​port_low_byte_;​75 ·​·​unsigned·​char·​port_low_byte_;​
76 ·​·​asio:​:​ip:​:​address_v4:​:​bytes_type·​address_;​76 ·​·​asio:​:​ip:​:​address_v4:​:​bytes_type·​address_;​
77 ·​·​std:​:​string·​user_id_;​77 ·​·​std:​:​string·​user_id_;​
78 ·​·​unsigned·​char·​null_byte_;​78 ·​·​unsigned·​char·​null_byte_;​
79 };​79 };​
80 80
81 class·​reply81 class·​reply
82 {82 {
83 public:​83 public:​
84 ·​·​enum·​status_type84 ·​·​enum·​status_type
85 ·​·​{85 ·​·​{
86 ·​·​·​·​request_granted·​=·​0x5a,​86 ·​·​·​·​request_granted·​=·​0x5a,​
87 ·​·​·​·​request_failed·​=·​0x5b,​87 ·​·​·​·​request_failed·​=·​0x5b,​
88 ·​·​·​·​request_failed_no_ide​ntd·​=·​0x5c,​88 ·​·​·​·​request_failed_no_ide​ntd·​=·​0x5c,​
89 ·​·​·​·​request_failed_bad_us​er_id·​=·​0x5d89 ·​·​·​·​request_failed_bad_us​er_id·​=·​0x5d
90 ·​·​};​90 ·​·​};​
91 91
92 ·​·​reply()​92 ·​·​reply()​
93 ·​·​·​·​:​·​null_byte_(0)​,​93 ·​·​·​·​:​·​null_byte_(0)​,​
94 ·​·​·​·​·​·​status_()​94 ·​·​·​·​·​·​status_()​
95 ·​·​{95 ·​·​{
96 ·​·​}96 ·​·​}
97 97
98 ·​·​boost:​:​array<asio:​:​mutable_buffer,​·​5>·​buffers()​98 ·​·​std:​:​array<asio:​:​mutable_buffer,​·​5>·​buffers()​
99 ·​·​{99 ·​·​{
100 ·​·​·​·​boost:​:​array<asio:​:​mutable_buffer,​·​5>·​bufs·​=100 ·​·​·​·​return
101 ·​·​·​·​{101 ·​·​·​·​{
102 ·​·​·​·​·​·​{102 ·​·​·​·​·​·​{
103 ·​·​·​·​·​·​·​·​asio:​:​buffer(&null_byte_,​·​1)​,​103 ·​·​·​·​·​·​·​·​asio:​:​buffer(&null_byte_,​·​1)​,​
104 ·​·​·​·​·​·​·​·​asio:​:​buffer(&status_,​·​1)​,​104 ·​·​·​·​·​·​·​·​asio:​:​buffer(&status_,​·​1)​,​
105 ·​·​·​·​·​·​·​·​asio:​:​buffer(&port_high_byt​e_,​·​1)​,​105 ·​·​·​·​·​·​·​·​asio:​:​buffer(&port_high_byt​e_,​·​1)​,​
106 ·​·​·​·​·​·​·​·​asio:​:​buffer(&port_low_byte​_,​·​1)​,​106 ·​·​·​·​·​·​·​·​asio:​:​buffer(&port_low_byte​_,​·​1)​,​
107 ·​·​·​·​·​·​·​·​asio:​:​buffer(address_)​107 ·​·​·​·​·​·​·​·​asio:​:​buffer(address_)​
108 ·​·​·​·​·​·​}108 ·​·​·​·​·​·​}
109 ·​·​·​·​};​109 ·​·​·​·​};​
110 ·​·​·​·​return·​bufs;​
111 ·​·​}110 ·​·​}
112 111
113 ·​·​bool·​success()​·​const112 ·​·​bool·​success()​·​const
114 ·​·​{113 ·​·​{
115 ·​·​·​·​return·​null_byte_·​==·​0·​&&·​status_·​==·​request_granted;​114 ·​·​·​·​return·​null_byte_·​==·​0·​&&·​status_·​==·​request_granted;​
116 ·​·​}115 ·​·​}
117 116
118 ·​·​unsigned·​char·​status()​·​const117 ·​·​unsigned·​char·​status()​·​const
119 ·​·​{118 ·​·​{
120 ·​·​·​·​return·​status_;​119 ·​·​·​·​return·​status_;​
121 ·​·​}120 ·​·​}
122 121
123 ·​·​asio:​:​ip:​:​tcp:​:​endpoint·​endpoint()​·​const122 ·​·​asio:​:​ip:​:​tcp:​:​endpoint·​endpoint()​·​const
124 ·​·​{123 ·​·​{
125 ·​·​·​·​unsigned·​short·​port·​=·​port_high_byte_;​124 ·​·​·​·​unsigned·​short·​port·​=·​port_high_byte_;​
126 ·​·​·​·​port·​=·​(port·​<<·​8)​·​&·​0xff00;​125 ·​·​·​·​port·​=·​(port·​<<·​8)​·​&·​0xff00;​
127 ·​·​·​·​port·​=·​port·​|·​port_low_byte_;​126 ·​·​·​·​port·​=·​port·​|·​port_low_byte_;​
128 127
129 ·​·​·​·​asio:​:​ip:​:​address_v4·​address(address_)​;​128 ·​·​·​·​asio:​:​ip:​:​address_v4·​address(address_)​;​
130 129
131 ·​·​·​·​return·​asio:​:​ip:​:​tcp:​:​endpoint(address,​·​port)​;​130 ·​·​·​·​return·​asio:​:​ip:​:​tcp:​:​endpoint(address,​·​port)​;​
132 ·​·​}131 ·​·​}
133 132
134 private:​133 private:​
135 ·​·​unsigned·​char·​null_byte_;​134 ·​·​unsigned·​char·​null_byte_;​
136 ·​·​unsigned·​char·​status_;​135 ·​·​unsigned·​char·​status_;​
137 ·​·​unsigned·​char·​port_high_byte_;​136 ·​·​unsigned·​char·​port_high_byte_;​
138 ·​·​unsigned·​char·​port_low_byte_;​137 ·​·​unsigned·​char·​port_low_byte_;​
139 ·​·​asio:​:​ip:​:​address_v4:​:​bytes_type·​address_;​138 ·​·​asio:​:​ip:​:​address_v4:​:​bytes_type·​address_;​
140 };​139 };​
141 140
142 }·​/​/​·​namespace·​socks4141 }·​/​/​·​namespace·​socks4
143 142
144 #endif·​/​/​·​SOCKS4_HPP143 #endif·​/​/​·​SOCKS4_HPP