src/​examples/​cpp03/​icmp/​ipv4_header.​hppsrc/​examples/​cpp11/​icmp/​ipv4_header.​hpp
1 /​/​1 /​/​
2 /​/​·​ipv4_header.​hpp2 /​/​·​ipv4_header.​hpp
3 /​/​·​~~~~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2017·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2017·​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·​IPV4_HEADER_HPP11 #ifndef·​IPV4_HEADER_HPP
12 #define·​IPV4_HEADER_HPP12 #define·​IPV4_HEADER_HPP
13 13
14 #include·​<algorithm>
15 #include·​<asio/​ip/​address_v4.​hpp>14 #include·​<asio/​ip/​address_v4.​hpp>
16 15
17 /​/​·​Packet·​header·​for·​IPv4.​16 /​/​·​Packet·​header·​for·​IPv4.​
18 /​/​17 /​/​
19 /​/​·​The·​wire·​format·​of·​an·​IPv4·​header·​is:​18 /​/​·​The·​wire·​format·​of·​an·​IPv4·​header·​is:​
20 /​/​·19 /​/​·
21 /​/​·​0···············​8···············​16·····························​3120 /​/​·​0···············​8···············​16·····························​31
22 /​/​·​+-​-​-​-​-​-​-​+-​-​-​-​-​-​-​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+······​-​-​-​21 /​/​·​+-​-​-​-​-​-​-​+-​-​-​-​-​-​-​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+······​-​-​-​
23 /​/​·​|·······​|·······​|···············​|······························​|·······​^22 /​/​·​|·······​|·······​|···············​|······························​|·······​^
24 /​/​·​|version|header·​|····​type·​of····​|····​total·​length·​in·​bytes·····​|·······​|23 /​/​·​|version|header·​|····​type·​of····​|····​total·​length·​in·​bytes·····​|·······​|
25 /​/​·​|··​(4)​··​|·​length|····​service····​|······························​|·······​|24 /​/​·​|··​(4)​··​|·​length|····​service····​|······························​|·······​|
26 /​/​·​+-​-​-​-​-​-​-​+-​-​-​-​-​-​-​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+-​+-​+-​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+·······​|25 /​/​·​+-​-​-​-​-​-​-​+-​-​-​-​-​-​-​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+-​+-​+-​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+·······​|
27 /​/​·​|·······························​|·​|·​|·​|························​|·······​|26 /​/​·​|·······························​|·​|·​|·​|························​|·······​|
28 /​/​·​|········​identification·········​|0|D|M|····​fragment·​offset·····​|·······​|27 /​/​·​|········​identification·········​|0|D|M|····​fragment·​offset·····​|·······​|
29 /​/​·​|·······························​|·​|F|F|························​|·······​|28 /​/​·​|·······························​|·​|F|F|························​|·······​|
30 /​/​·​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+-​+-​+-​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+·······​|29 /​/​·​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+-​+-​+-​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+·······​|
31 /​/​·​|···············​|···············​|······························​|·······​|30 /​/​·​|···············​|···············​|······························​|·······​|
32 /​/​·​|·​time·​to·​live··​|···​protocol····​|·······​header·​checksum········​|···​20·​bytes31 /​/​·​|·​time·​to·​live··​|···​protocol····​|·······​header·​checksum········​|···​20·​bytes
33 /​/​·​|···············​|···············​|······························​|·······​|32 /​/​·​|···············​|···············​|······························​|·······​|
34 /​/​·​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+·······​|33 /​/​·​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+·······​|
35 /​/​·​|······························································​|·······​|34 /​/​·​|······························································​|·······​|
36 /​/​·​|······················​source·​IPv4·​address·····················​|·······​|35 /​/​·​|······················​source·​IPv4·​address·····················​|·······​|
37 /​/​·​|······························································​|·······​|36 /​/​·​|······························································​|·······​|
38 /​/​·​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+·······​|37 /​/​·​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+·······​|
39 /​/​·​|······························································​|·······​|38 /​/​·​|······························································​|·······​|
40 /​/​·​|···················​destination·​IPv4·​address···················​|·······​|39 /​/​·​|···················​destination·​IPv4·​address···················​|·······​|
41 /​/​·​|······························································​|·······​v40 /​/​·​|······························································​|·······​v
42 /​/​·​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+······​-​-​-​41 /​/​·​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+······​-​-​-​
43 /​/​·​|······························································​|·······​^42 /​/​·​|······························································​|·······​^
44 /​/​·​|······························································​|·······​|43 /​/​·​|······························································​|·······​|
45 /​/​·​/​························​options·​(if·​any)​······················​/​····​0·​-​·​4044 /​/​·​/​························​options·​(if·​any)​······················​/​····​0·​-​·​40
46 /​/​·​/​······························································​/​·····​bytes45 /​/​·​/​······························································​/​·····​bytes
47 /​/​·​|······························································​|·······​|46 /​/​·​|······························································​|·······​|
48 /​/​·​|······························································​|·······​v47 /​/​·​|······························································​|·······​v
49 /​/​·​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+······​-​-​-​48 /​/​·​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+······​-​-​-​
50 49
51 class·​ipv4_header50 class·​ipv4_header
52 {51 {
53 public:​52 public:​
54 ··​ipv4_header()​·​{·​std:​:​fill(rep_,​·​rep_·​+·​sizeof(rep_)​,​·​0)​;​·​}
55
56 ··​unsigned·​char·​version()​·​const·​{·​return·​(rep_[0]·​>>·​4)​·​&·​0xF;​·​}53 ··​unsigned·​char·​version()​·​const·​{·​return·​(rep_[0]·​>>·​4)​·​&·​0xF;​·​}
57 ··​unsigned·​short·​header_length()​·​const·​{·​return·​(rep_[0]·​&·​0xF)​·​*·​4;​·​}54 ··​unsigned·​short·​header_length()​·​const·​{·​return·​(rep_[0]·​&·​0xF)​·​*·​4;​·​}
58 ··​unsigned·​char·​type_of_service()​·​const·​{·​return·​rep_[1];​·​}55 ··​unsigned·​char·​type_of_service()​·​const·​{·​return·​rep_[1];​·​}
59 ··​unsigned·​short·​total_length()​·​const·​{·​return·​decode(2,​·​3)​;​·​}56 ··​unsigned·​short·​total_length()​·​const·​{·​return·​decode(2,​·​3)​;​·​}
60 ··​unsigned·​short·​identification()​·​const·​{·​return·​decode(4,​·​5)​;​·​}57 ··​unsigned·​short·​identification()​·​const·​{·​return·​decode(4,​·​5)​;​·​}
61 ··​bool·​dont_fragment()​·​const·​{·​return·​(rep_[6]·​&·​0x40)​·​!=·​0;​·​}58 ··​bool·​dont_fragment()​·​const·​{·​return·​(rep_[6]·​&·​0x40)​·​!=·​0;​·​}
62 ··​bool·​more_fragments()​·​const·​{·​return·​(rep_[6]·​&·​0x20)​·​!=·​0;​·​}59 ··​bool·​more_fragments()​·​const·​{·​return·​(rep_[6]·​&·​0x20)​·​!=·​0;​·​}
63 ··​unsigned·​short·​fragment_offset()​·​const·​{·​return·​decode(6,​·​7)​·​&·​0x1FFF;​·​}60 ··​unsigned·​short·​fragment_offset()​·​const·​{·​return·​decode(6,​·​7)​·​&·​0x1FFF;​·​}
64 ··​unsigned·​int·​time_to_live()​·​const·​{·​return·​rep_[8];​·​}61 ··​unsigned·​int·​time_to_live()​·​const·​{·​return·​rep_[8];​·​}
65 ··​unsigned·​char·​protocol()​·​const·​{·​return·​rep_[9];​·​}62 ··​unsigned·​char·​protocol()​·​const·​{·​return·​rep_[9];​·​}
66 ··​unsigned·​short·​header_checksum()​·​const·​{·​return·​decode(10,​·​11)​;​·​}63 ··​unsigned·​short·​header_checksum()​·​const·​{·​return·​decode(10,​·​11)​;​·​}
67 64
68 ··​asio:​:​ip:​:​address_v4·​source_address()​·​const65 ··​asio:​:​ip:​:​address_v4·​source_address()​·​const
69 ··​{66 ··​{
70 ····​asio:​:​ip:​:​address_v4:​:​bytes_type·​bytes67 ····​asio:​:​ip:​:​address_v4:​:​bytes_type·​bytes
71 ······​=·​{·​{·​rep_[12],​·​rep_[13],​·​rep_[14],​·​rep_[15]·​}·​};​68 ······​=·​{·​{·​rep_[12],​·​rep_[13],​·​rep_[14],​·​rep_[15]·​}·​};​
72 ····​return·​asio:​:​ip:​:​address_v4(bytes)​;​69 ····​return·​asio:​:​ip:​:​address_v4(bytes)​;​
73 ··​}70 ··​}
74 71
75 ··​asio:​:​ip:​:​address_v4·​destination_address()​·​const72 ··​asio:​:​ip:​:​address_v4·​destination_address()​·​const
76 ··​{73 ··​{
77 ····​asio:​:​ip:​:​address_v4:​:​bytes_type·​bytes74 ····​asio:​:​ip:​:​address_v4:​:​bytes_type·​bytes
78 ······​=·​{·​{·​rep_[16],​·​rep_[17],​·​rep_[18],​·​rep_[19]·​}·​};​75 ······​=·​{·​{·​rep_[16],​·​rep_[17],​·​rep_[18],​·​rep_[19]·​}·​};​
79 ····​return·​asio:​:​ip:​:​address_v4(bytes)​;​76 ····​return·​asio:​:​ip:​:​address_v4(bytes)​;​
80 ··​}77 ··​}
81 78
79 #if·​0
82 ··​friend·​std:​:​istream&·​operator>>(std:​:​istream&·​is,​·​ipv4_header&·​header)​80 ··​friend·​std:​:​istream&·​operator>>(std:​:​istream&·​is,​·​ipv4_header&·​header)​
83 ··​{81 ··​{
84 ····​is.​read(reinterpret_cast​<char*>(header.​rep_)​,​·​20)​;​82 ····​is.​read(reinterpret_cast​<char*>(header.​rep_)​,​·​20)​;​
85 ····​if·​(header.​version()​·​!=·​4)​83 ····​if·​(header.​version()​·​!=·​4)​
86 ······​is.​setstate(std:​:​ios:​:​failbit)​;​84 ······​is.​setstate(std:​:​ios:​:​failbit)​;​
87 ····​std:​:​streamsize·​options_length·​=·​header.​header_length()​·​-​·​20;​85 ····​std:​:​streamsize·​options_length·​=·​header.​header_length()​·​-​·​20;​
88 ····​if·​(options_length·​<·​0·​||·​options_length·​>·​40)​86 ····​if·​(options_length·​<·​0·​||·​options_length·​>·​40)​
89 ······​is.​setstate(std:​:​ios:​:​failbit)​;​87 ······​is.​setstate(std:​:​ios:​:​failbit)​;​
90 ····​else88 ····​else
91 ······​is.​read(reinterpret_cast​<char*>(header.​rep_)​·​+·​20,​·​options_length)​;​89 ······​is.​read(reinterpret_cast​<char*>(header.​rep_)​·​+·​20,​·​options_length)​;​
92 ····​return·​is;​90 ····​return·​is;​
93 ··​}91 ··​}
92 #endif
94 93
95 private:​94 private:​
96 ··​unsigned·​short·​decode(int·​a,​·​int·​b)​·​const95 ··​unsigned·​short·​decode(int·​a,​·​int·​b)​·​const
97 ····​{·​return·​(rep_[a]·​<<·​8)​·​+·​rep_[b];​·​}96 ····​{·​return·​(rep_[a]·​<<·​8)​·​+·​rep_[b];​·​}
98 97
99 ··​unsigned·​char·​rep_[60];​98 ··​unsigned·​char·​rep_[60]·=·{·0·};​
100 };​99 };​
101 100
102 #endif·​/​/​·​IPV4_HEADER_HPP101 #endif·​/​/​·​IPV4_HEADER_HPP