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 @@ -617,8 +617,24 @@ IPAddress NetworkClient::localIP(int fd) const {
617617 struct sockaddr_storage addr;
618618 socklen_t len = sizeof addr;
619619 getsockname (fd, (struct sockaddr *)&addr, &len);
620- struct sockaddr_in *s = (struct sockaddr_in *)&addr;
621- return IPAddress ((uint32_t )(s->sin_addr .s_addr ));
620+
621+ // IPv4 socket, old way
622+ if (((struct sockaddr *)&addr)->sa_family == AF_INET) {
623+ struct sockaddr_in *s = (struct sockaddr_in *)&addr;
624+ return IPAddress ((uint32_t )(s->sin_addr .s_addr ));
625+ }
626+
627+ // IPv6, but it might be IPv4 mapped address
628+ if (((struct sockaddr *)&addr)->sa_family == AF_INET6) {
629+ struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)&addr;
630+ if (IN6_IS_ADDR_V4MAPPED (saddr6->sin6_addr .un .u32_addr )) {
631+ return IPAddress (IPv4, (uint8_t *)saddr6->sin6_addr .s6_addr + IPADDRESS_V4_BYTES_INDEX);
632+ } else {
633+ return IPAddress (IPv6, (uint8_t *)(saddr6->sin6_addr .s6_addr ), saddr6->sin6_scope_id );
634+ }
635+ }
636+ log_e (" NetworkClient::localIP Not AF_INET or AF_INET6?" );
637+ return (IPAddress (0 , 0 , 0 , 0 ));
622638}
623639
624640uint16_t NetworkClient::localPort (int fd) const {
You can’t perform that action at this time.
0 commit comments