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-​2022·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2022·​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