File tree Expand file tree Collapse file tree 1 file changed +18
-2
lines changed
Expand file tree Collapse file tree 1 file changed +18
-2
lines changed Original file line number Diff line number Diff line change @@ -589,8 +589,24 @@ IPAddress NetworkClient::localIP(int fd) const {
589589 struct sockaddr_storage addr;
590590 socklen_t len = sizeof addr;
591591 getsockname (fd, (struct sockaddr *)&addr, &len);
592- struct sockaddr_in *s = (struct sockaddr_in *)&addr;
593- return IPAddress ((uint32_t )(s->sin_addr .s_addr ));
592+
593+ // IPv4 socket, old way
594+ if (((struct sockaddr *)&addr)->sa_family == AF_INET) {
595+ struct sockaddr_in *s = (struct sockaddr_in *)&addr;
596+ return IPAddress ((uint32_t )(s->sin_addr .s_addr ));
597+ }
598+
599+ // IPv6, but it might be IPv4 mapped address
600+ if (((struct sockaddr *)&addr)->sa_family == AF_INET6) {
601+ struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)&addr;
602+ if (IN6_IS_ADDR_V4MAPPED (saddr6->sin6_addr .un .u32_addr )) {
603+ return IPAddress (IPv4, (uint8_t *)saddr6->sin6_addr .s6_addr + IPADDRESS_V4_BYTES_INDEX);
604+ } else {
605+ return IPAddress (IPv6, (uint8_t *)(saddr6->sin6_addr .s6_addr ), saddr6->sin6_scope_id );
606+ }
607+ }
608+ log_e (" NetworkClient::localIP Not AF_INET or AF_INET6?" );
609+ return (IPAddress (0 , 0 , 0 , 0 ));
594610}
595611
596612uint16_t NetworkClient::localPort (int fd) const {
You can’t perform that action at this time.
0 commit comments