src/​examples/​cpp03/​socks4/​sync_client.​cppsrc/​examples/​cpp11/​socks4/​sync_client.​cpp
1 /​/​1 /​/​
2 /​/​·​sync_client.​cpp2 /​/​·​sync_client.​cpp
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 #include·​<array>
11 #include·​<iostream>12 #include·​<iostream>
12 #include·​<iomanip>13 #include·​<iomanip>
13 #include·​<ostream>14 #include·​<ostream>
14 #include·​<string>15 #include·​<string>
15 #include·​<asio.​hpp>16 #include·​<asio.​hpp>
16 #include·​<boost/​array.​hpp>
17 #include·​"socks4.​hpp"17 #include·​"socks4.​hpp"
18 18
19 using·​asio:​:​ip:​:​tcp;​19 using·​asio:​:​ip:​:​tcp;​
20 20
21 int·​main(int·​argc,​·​char*·​argv[])​21 int·​main(int·​argc,​·​char*·​argv[])​
22 {22 {
23 ··​try23 ··​try
24 ··​{24 ··​{
25 ····​if·​(argc·​!=·​4)​25 ····​if·​(argc·​!=·​4)​
26 ····​{26 ····​{
27 ······​std:​:​cout·​<<·​"Usage:​·​sync_client·​<socks4server>·​<socks4port>·​<user>\n";​27 ······​std:​:​cout·​<<·​"Usage:​·​sync_client·​<socks4server>·​<socks4port>·​<user>\n";​
28 ······​std:​:​cout·​<<·​"Examples:​\n";​28 ······​std:​:​cout·​<<·​"Examples:​\n";​
29 ······​std:​:​cout·​<<·​"··​sync_client·​127.​0.​0.​1·​1080·​chris\n";​29 ······​std:​:​cout·​<<·​"··​sync_client·​127.​0.​0.​1·​1080·​chris\n";​
30 ······​std:​:​cout·​<<·​"··​sync_client·​localhost·​socks·​chris\n";​30 ······​std:​:​cout·​<<·​"··​sync_client·​localhost·​socks·​chris\n";​
31 ······​return·​1;​31 ······​return·​1;​
32 ····​}32 ····​}
33 33
34 ····​asio:​:​io_context·​io_context;​34 ····​asio:​:​io_context·​io_context;​
35 35
36 ····​/​/​·​Get·​a·​list·​of·​endpoints·​corresponding·​to·​the·​SOCKS·​4·​server·​name.​36 ····​/​/​·​Get·​a·​list·​of·​endpoints·​corresponding·​to·​the·​SOCKS·​4·​server·​name.​
37 ····​tcp:​:​resolver·​resolver(io_context)​;​37 ····​tcp:​:​resolver·​resolver(io_context)​;​
38 ····tcp:​:​resolver:​:​results_type·​endpoints·​=·​resolver.​resolve(argv[1],​·​argv[2])​;​38 ····auto·​endpoints·​=·​resolver.​resolve(argv[1],​·​argv[2])​;​
39 39
40 ····​/​/​·​Try·​each·​endpoint·​until·​we·​successfully·​establish·​a·​connection·​to·​the40 ····​/​/​·​Try·​each·​endpoint·​until·​we·​successfully·​establish·​a·​connection·​to·​the
41 ····​/​/​·​SOCKS·​4·​server.​41 ····​/​/​·​SOCKS·​4·​server.​
42 ····​tcp:​:​socket·​socket(io_context)​;​42 ····​tcp:​:​socket·​socket(io_context)​;​
43 ····​asio:​:​connect(socket,​·​endpoints)​;​43 ····​asio:​:​connect(socket,​·​endpoints)​;​
44 44
45 ····​/​/​·​Get·​an·​endpoint·​for·​the·​Boost·​website.​·​This·​will·​be·​passed·​to·​the·​SOCKS45 ····​/​/​·​Get·​an·​endpoint·​for·​the·​Boost·​website.​·​This·​will·​be·​passed·​to·​the·​SOCKS
46 ····​/​/​·​4·​server.​·​Explicitly·​specify·​IPv4·​since·​SOCKS·​4·​does·​not·​support·​IPv6.​46 ····​/​/​·​4·​server.​·​Explicitly·​specify·​IPv4·​since·​SOCKS·​4·​does·​not·​support·​IPv6.​
47 ····tcp:​:​endpoint·​http_endpoint·​=47 ····auto·​http_endpoint·​=
48 ······​*resolver.​resolve(tcp:​:​v4()​,​·​"www.​boost.​org",​·​"http")​.​begin()​;​48 ······​*resolver.​resolve(tcp:​:​v4()​,​·​"www.​boost.​org",​·​"http")​.​begin()​;​
49 49
50 ····​/​/​·​Send·​the·​request·​to·​the·​SOCKS·​4·​server.​50 ····​/​/​·​Send·​the·​request·​to·​the·​SOCKS·​4·​server.​
51 ····​socks4:​:​request·​socks_request(51 ····​socks4:​:​request·​socks_request(
52 ········​socks4:​:​request:​:​connect,​·​http_endpoint,​·​argv[3])​;​52 ········​socks4:​:​request:​:​connect,​·​http_endpoint,​·​argv[3])​;​
53 ····​asio:​:​write(socket,​·​socks_request.​buffers()​)​;​53 ····​asio:​:​write(socket,​·​socks_request.​buffers()​)​;​
54 54
55 ····​/​/​·​Receive·​a·​response·​from·​the·​SOCKS·​4·​server.​55 ····​/​/​·​Receive·​a·​response·​from·​the·​SOCKS·​4·​server.​
56 ····​socks4:​:​reply·​socks_reply;​56 ····​socks4:​:​reply·​socks_reply;​
57 ····​asio:​:​read(socket,​·​socks_reply.​buffers()​)​;​57 ····​asio:​:​read(socket,​·​socks_reply.​buffers()​)​;​
58 58
59 ····​/​/​·​Check·​whether·​we·​successfully·​negotiated·​with·​the·​SOCKS·​4·​server.​59 ····​/​/​·​Check·​whether·​we·​successfully·​negotiated·​with·​the·​SOCKS·​4·​server.​
60 ····​if·​(!socks_reply.​success()​)​60 ····​if·​(!socks_reply.​success()​)​
61 ····​{61 ····​{
62 ······​std:​:​cout·​<<·​"Connection·​failed.​\n";​62 ······​std:​:​cout·​<<·​"Connection·​failed.​\n";​
63 ······​std:​:​cout·​<<·​"status·​=·​0x"·​<<·​std:​:​hex·​<<·​socks_reply.​status()​;​63 ······​std:​:​cout·​<<·​"status·​=·​0x"·​<<·​std:​:​hex·​<<·​socks_reply.​status()​;​
64 ······​return·​1;​64 ······​return·​1;​
65 ····​}65 ····​}
66 66
67 ····​/​/​·​Form·​the·​HTTP·​request.​·​We·​specify·​the·​"Connection:​·​close"·​header·​so·​that67 ····​/​/​·​Form·​the·​HTTP·​request.​·​We·​specify·​the·​"Connection:​·​close"·​header·​so·​that
68 ····​/​/​·​the·​server·​will·​close·​the·​socket·​after·​transmitting·​the·​response.​·​This68 ····​/​/​·​the·​server·​will·​close·​the·​socket·​after·​transmitting·​the·​response.​·​This
69 ····​/​/​·​will·​allow·​us·​to·​treat·​all·​data·​up·​until·​the·​EOF·​as·​the·​response.​69 ····​/​/​·​will·​allow·​us·​to·​treat·​all·​data·​up·​until·​the·​EOF·​as·​the·​response.​
70 ····​std:​:​string·​request·​=70 ····​std:​:​string·​request·​=
71 ······​"GET·​/​·​HTTP/​1.​0\r\n"71 ······​"GET·​/​·​HTTP/​1.​0\r\n"
72 ······​"Host:​·​www.​boost.​org\r\n"72 ······​"Host:​·​www.​boost.​org\r\n"
73 ······​"Accept:​·​*/​*\r\n"73 ······​"Accept:​·​*/​*\r\n"
74 ······​"Connection:​·​close\r\n\r\n";​74 ······​"Connection:​·​close\r\n\r\n";​
75 75
76 ····​/​/​·​Send·​the·​HTTP·​request.​76 ····​/​/​·​Send·​the·​HTTP·​request.​
77 ····​asio:​:​write(socket,​·​asio:​:​buffer(request)​)​;​77 ····​asio:​:​write(socket,​·​asio:​:​buffer(request)​)​;​
78 78
79 ····​/​/​·​Read·​until·​EOF,​·​writing·​data·​to·​output·​as·​we·​go.​79 ····​/​/​·​Read·​until·​EOF,​·​writing·​data·​to·​output·​as·​we·​go.​
80 ····boost:​:​array<char,​·​512>·​response;​80 ····​std:​:​array<char,​·​512>·​response;​
81 ····asio:​:​error_code·​error;​81 ····​std:​:​error_code·​error;​
82 ····​while·​(std:​:​size_t·​s·​=·​socket.​read_some(82 ····​while·​(std:​:​size_t·​s·​=·​socket.​read_some(
83 ··········​asio:​:​buffer(response)​,​·​error)​)​83 ··········​asio:​:​buffer(response)​,​·​error)​)​
84 ······​std:​:​cout.​write(response.​data()​,​·​s)​;​84 ······​std:​:​cout.​write(response.​data()​,​·​s)​;​
85 ····​if·​(error·​!=·​asio:​:​error:​:​eof)​85 ····​if·​(error·​!=·​asio:​:​error:​:​eof)​
86 ······​throw·asio:​:​system_error(error)​;​86 ······​throw·​std:​:​system_error(error)​;​
87 ··​}87 ··​}
88 ··​catch·​(std:​:​exception&·​e)​88 ··​catch·​(std:​:​exception&·​e)​
89 ··​{89 ··​{
90 ····​std:​:​cout·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​90 ····​std:​:​cout·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
91 ··​}91 ··​}
92 92
93 ··​return·​0;​93 ··​return·​0;​
94 }94 }