@@ -139,7 +139,7 @@ namespace brynet { namespace net { namespace base {
139139 {
140140 InitSocket ();
141141
142- struct sockaddr_in ip4Addr = { 0 };
142+ struct sockaddr_in ip4Addr = { 0 };
143143 struct sockaddr_in6 ip6Addr = { 0 };
144144 struct sockaddr_in * paddr = &ip4Addr;
145145 int addrLen = sizeof (ip4Addr);
@@ -202,7 +202,7 @@ namespace brynet { namespace net { namespace base {
202202#endif
203203 }
204204
205- static std::string get_ip_str (const struct sockaddr *sa)
205+ static std::string getIPString (const struct sockaddr *sa)
206206 {
207207 char tmp[INET6_ADDRSTRLEN ] = { 0 };
208208 switch (sa->sa_family )
@@ -229,14 +229,14 @@ namespace brynet { namespace net { namespace base {
229229 int namelen = sizeof (name);
230230 if (getpeername (fd, (struct sockaddr *)&name, &namelen) == 0 )
231231 {
232- return get_ip_str (&name);
232+ return getIPString (&name);
233233 }
234234#else
235235 struct sockaddr_in name;
236236 socklen_t namelen = sizeof (name);
237237 if (getpeername (fd, (struct sockaddr *)&name, &namelen) == 0 )
238238 {
239- return get_ip_str ((const struct sockaddr *)&name);
239+ return getIPString ((const struct sockaddr *)&name);
240240 }
241241#endif
242242
@@ -266,4 +266,52 @@ namespace brynet { namespace net { namespace base {
266266 return socket (af, type, protocol);
267267 }
268268
269+ static struct sockaddr_in6 getLocalAddr (sock sockfd)
270+ {
271+ struct sockaddr_in6 localaddr;
272+ memset (&localaddr, 0 , sizeof localaddr);
273+ socklen_t addrlen = static_cast <socklen_t >(sizeof localaddr);
274+ if (::getsockname (sockfd, (struct sockaddr *)(&localaddr), &addrlen) < 0 )
275+ {
276+ return localaddr;
277+ }
278+ return localaddr;
279+ }
280+
281+ static struct sockaddr_in6 getPeerAddr (sock sockfd)
282+ {
283+ struct sockaddr_in6 peeraddr;
284+ memset (&peeraddr, 0 , sizeof peeraddr);
285+ socklen_t addrlen = static_cast <socklen_t >(sizeof peeraddr);
286+ if (::getpeername (sockfd, (struct sockaddr *)(&peeraddr), &addrlen) < 0 )
287+ {
288+ return peeraddr;
289+ }
290+ return peeraddr;
291+ }
292+
293+ /* copy from muduo */
294+ bool IsSelfConnect (sock fd)
295+ {
296+ struct sockaddr_in6 localaddr = getLocalAddr (fd);
297+ struct sockaddr_in6 peeraddr = getPeerAddr (fd);
298+
299+ if (localaddr.sin6_family == AF_INET )
300+ {
301+ const struct sockaddr_in * laddr4 = reinterpret_cast <struct sockaddr_in *>(&localaddr);
302+ const struct sockaddr_in * raddr4 = reinterpret_cast <struct sockaddr_in *>(&peeraddr);
303+ return laddr4->sin_port == raddr4->sin_port
304+ && laddr4->sin_addr .s_addr == raddr4->sin_addr .s_addr ;
305+ }
306+ else if (localaddr.sin6_family == AF_INET6 )
307+ {
308+ return localaddr.sin6_port == peeraddr.sin6_port
309+ && memcmp (&localaddr.sin6_addr , &peeraddr.sin6_addr , sizeof localaddr.sin6_addr ) == 0 ;
310+ }
311+ else
312+ {
313+ return false ;
314+ }
315+ }
316+
269317} } }
0 commit comments