@@ -37,43 +37,82 @@ static const in_addr_t kInaddrLoopback = INADDR_LOOPBACK;
37
37
// in_addr_t s_addr; /* address in network byte order */
38
38
// };
39
39
40
+ // struct sockaddr_in6 {
41
+ // sa_family_t sin6_family; /* address family: AF_INET6 */
42
+ // uint16_t sin6_port; /* port in network byte order */
43
+ // uint32_t sin6_flowinfo; /* IPv6 flow information */
44
+ // struct in6_addr sin6_addr; /* IPv6 address */
45
+ // uint32_t sin6_scope_id; /* IPv6 scope-id */
46
+ // };
47
+
40
48
using namespace muduo ;
41
49
using namespace muduo ::net;
42
50
43
- BOOST_STATIC_ASSERT (sizeof (InetAddress) == sizeof(struct sockaddr_in ));
51
+ BOOST_STATIC_ASSERT (sizeof (InetAddress) == sizeof(struct sockaddr_in6 ));
52
+ BOOST_STATIC_ASSERT (offsetof(sockaddr_in, sin_family) == 0);
53
+ BOOST_STATIC_ASSERT (offsetof(sockaddr_in6, sin6_family) == 0);
54
+ BOOST_STATIC_ASSERT (offsetof(sockaddr_in, sin_port) == 2);
55
+ BOOST_STATIC_ASSERT (offsetof(sockaddr_in6, sin6_port) == 2);
44
56
45
- InetAddress::InetAddress (uint16_t port, bool loopbackOnly)
57
+ InetAddress::InetAddress (uint16_t port, bool loopbackOnly, bool ipv6 )
46
58
{
47
- bzero (&addr_, sizeof addr_);
48
- addr_.sin_family = AF_INET;
49
- in_addr_t ip = loopbackOnly ? kInaddrLoopback : kInaddrAny ;
50
- addr_.sin_addr .s_addr = sockets::hostToNetwork32 (ip);
51
- addr_.sin_port = sockets::hostToNetwork16 (port);
59
+ BOOST_STATIC_ASSERT (offsetof (InetAddress, addr6_) == 0 );
60
+ BOOST_STATIC_ASSERT (offsetof (InetAddress, addr_) == 0 );
61
+ if (ipv6)
62
+ {
63
+ bzero (&addr6_, sizeof addr6_);
64
+ addr6_.sin6_family = AF_INET6;
65
+ in6_addr ip = loopbackOnly ? in6addr_loopback : in6addr_any;
66
+ addr6_.sin6_addr = ip;
67
+ addr6_.sin6_port = sockets::hostToNetwork16 (port);
68
+ }
69
+ else
70
+ {
71
+ bzero (&addr_, sizeof addr_);
72
+ addr_.sin_family = AF_INET;
73
+ in_addr_t ip = loopbackOnly ? kInaddrLoopback : kInaddrAny ;
74
+ addr_.sin_addr .s_addr = sockets::hostToNetwork32 (ip);
75
+ addr_.sin_port = sockets::hostToNetwork16 (port);
76
+ }
52
77
}
53
78
54
- InetAddress::InetAddress (StringArg ip, uint16_t port)
79
+ InetAddress::InetAddress (StringArg ip, uint16_t port, bool ipv6 )
55
80
{
56
- bzero (&addr_, sizeof addr_);
57
- sockets::fromIpPort (ip.c_str (), port, &addr_);
81
+ if (ipv6)
82
+ {
83
+ bzero (&addr6_, sizeof addr6_);
84
+ sockets::fromIpPort (ip.c_str (), port, &addr6_);
85
+ }
86
+ else
87
+ {
88
+ bzero (&addr_, sizeof addr_);
89
+ sockets::fromIpPort (ip.c_str (), port, &addr_);
90
+ }
58
91
}
59
92
60
93
string InetAddress::toIpPort () const
61
94
{
62
- char buf[32 ] ;
63
- sockets::toIpPort (buf, sizeof buf, addr_ );
95
+ char buf[64 ] = " " ;
96
+ sockets::toIpPort (buf, sizeof buf, getSockAddr () );
64
97
return buf;
65
98
}
66
99
67
100
string InetAddress::toIp () const
68
101
{
69
- char buf[32 ] ;
70
- sockets::toIp (buf, sizeof buf, addr_ );
102
+ char buf[64 ] = " " ;
103
+ sockets::toIp (buf, sizeof buf, getSockAddr () );
71
104
return buf;
72
105
}
73
106
107
+ uint32_t InetAddress::ipNetEndian () const
108
+ {
109
+ assert (family () == AF_INET);
110
+ return addr_.sin_addr .s_addr ;
111
+ }
112
+
74
113
uint16_t InetAddress::toPort () const
75
114
{
76
- return sockets::networkToHost16 (addr_. sin_port );
115
+ return sockets::networkToHost16 (portNetEndian () );
77
116
}
78
117
79
118
static __thread char t_resolveBuffer[64 * 1024 ];
0 commit comments