File tree 1 file changed +18
-2
lines changed
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 {
589
589
struct sockaddr_storage addr;
590
590
socklen_t len = sizeof addr;
591
591
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 ));
594
610
}
595
611
596
612
uint16_t NetworkClient::localPort (int fd) const {
You can’t perform that action at this time.
0 commit comments