///////////////////////////////////////////////////////
| 759 | |
| 760 | //////////////////////////////////////////////////////////// |
| 761 | std::optional<IpAddress> TcpSocket::getRemoteAddress() const |
| 762 | { |
| 763 | if (getNativeHandle() != priv::SocketImpl::invalidSocket()) |
| 764 | { |
| 765 | // Get the address family of the socket |
| 766 | sockaddr_in6 address{}; |
| 767 | priv::SocketImpl::AddrLength size = sizeof(address); |
| 768 | |
| 769 | if (getsockname(getNativeHandle(), reinterpret_cast<sockaddr*>(&address), &size) == -1) |
| 770 | return std::nullopt; |
| 771 | |
| 772 | // Retrieve information about the remote end of the socket |
| 773 | if (address.sin6_family == PF_INET) |
| 774 | { |
| 775 | sockaddr_in addressV4{}; |
| 776 | priv::SocketImpl::AddrLength sizeV4 = sizeof(address); |
| 777 | if (getpeername(getNativeHandle(), reinterpret_cast<sockaddr*>(&addressV4), &sizeV4) != -1) |
| 778 | return IpAddress(ntohl(addressV4.sin_addr.s_addr)); |
| 779 | } |
| 780 | else if (address.sin6_family == PF_INET6) |
| 781 | { |
| 782 | sockaddr_in6 addressV6{}; |
| 783 | priv::SocketImpl::AddrLength sizeV6 = sizeof(addressV6); |
| 784 | if (getpeername(getNativeHandle(), reinterpret_cast<sockaddr*>(&addressV6), &sizeV6) != -1) |
| 785 | { |
| 786 | return IpAddress( |
| 787 | {addressV6.sin6_addr.s6_addr[0], |
| 788 | addressV6.sin6_addr.s6_addr[1], |
| 789 | addressV6.sin6_addr.s6_addr[2], |
| 790 | addressV6.sin6_addr.s6_addr[3], |
| 791 | addressV6.sin6_addr.s6_addr[4], |
| 792 | addressV6.sin6_addr.s6_addr[5], |
| 793 | addressV6.sin6_addr.s6_addr[6], |
| 794 | addressV6.sin6_addr.s6_addr[7], |
| 795 | addressV6.sin6_addr.s6_addr[8], |
| 796 | addressV6.sin6_addr.s6_addr[9], |
| 797 | addressV6.sin6_addr.s6_addr[10], |
| 798 | addressV6.sin6_addr.s6_addr[11], |
| 799 | addressV6.sin6_addr.s6_addr[12], |
| 800 | addressV6.sin6_addr.s6_addr[13], |
| 801 | addressV6.sin6_addr.s6_addr[14], |
| 802 | addressV6.sin6_addr.s6_addr[15]}); |
| 803 | } |
| 804 | } |
| 805 | } |
| 806 | |
| 807 | // We failed to retrieve the address |
| 808 | return std::nullopt; |
| 809 | } |
| 810 | |
| 811 | |
| 812 | //////////////////////////////////////////////////////////// |
no test coverage detected