VirtualBox

Changeset 26588 in vbox


Ignore:
Timestamp:
Feb 16, 2010 5:02:59 PM (15 years ago)
Author:
vboxsync
Message:

iprt: New type RTNETADDR for storing any address + type + port. Added %RTnaddr for printing it.

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/iprt/net.h

    r25645 r26588  
    5858typedef RTUINT128U RTNETADDRIPV6;
    5959AssertCompileSize(RTNETADDRIPV6, 16);
    60 /** Pointer to a IPv4 address. */
     60/** Pointer to a IPv6 address. */
    6161typedef RTNETADDRIPV6 *PRTNETADDRIPV6;
    62 /** Pointer to a const IPv4 address. */
     62/** Pointer to a const IPv6 address. */
    6363typedef RTNETADDRIPV6 const *PCRTNETADDRIPV6;
    6464
     
    8282
    8383/**
    84  * Address union.
     84 * Network address union.
     85 *
     86 * @remarks The size of this structure may change in the future.
    8587 */
    8688typedef union RTNETADDRU
     
    109111typedef RTNETADDRU const *PCRTNETADDRU;
    110112
     113/**
     114 * Network address type.
     115 *
     116 * @remarks The value assignments may change in the future.
     117 */
     118typedef enum RTNETADDRTYPE
     119{
     120    /** The invalid 0 entry. */
     121    RTNETADDRTYPE_INVALID = 0,
     122    /** IP version 4. */
     123    RTNETADDRTYPE_IPV4,
     124    /** IP version 6. */
     125    RTNETADDRTYPE_IPV6,
     126    /** IPX. */
     127    RTNETADDRTYPE_IPX,
     128    /** MAC address. */
     129    RTNETADDRTYPE_MAC,
     130    /** The end of the valid values. */
     131    RTNETADDRTYPE_END,
     132    /** The usual 32-bit hack. */
     133    RTNETADDRTYPE_32_BIT_HACK = 0x7fffffff
     134} RTNETADDRTYPE;
     135/** Pointer to a network address type. */
     136typedef RTNETADDRTYPE *PRTNETADDRTYPE;
     137/** Pointer to a const network address type. */
     138typedef RTNETADDRTYPE const  *PCRTNETADDRTYPE;
     139
     140/**
     141 * Network address.
     142 *
     143 * @remarks The size and type values may change.
     144 */
     145typedef struct RTNETADDR
     146{
     147    /** The address union. */
     148    RTNETADDRU      uAddr;
     149    /** Indicates which view of @a u that is valid. */
     150    RTNETADDRTYPE   enmType;
     151    /** The port number for IPv4 and IPv6 addresses.  This is set to
     152     *  RTNETADDR_NA_PORT if not applicable. */
     153    uint32_t        uPort;
     154} RTNETADDR;
     155/** Pointer to a network address. */
     156typedef RTNETADDR *PRTNETADDR;
     157/** Pointer to a const network address. */
     158typedef RTNETADDR const *PCRTNETADDR;
     159
     160/** The not applicable value of  RTNETADDR::uPort value use to inid. */
     161#define RTNETADDR_PORT_NA       UINT32_MAX
    111162
    112163/**
  • trunk/include/iprt/tcp.h

    r25724 r26588  
    3434#include <iprt/types.h>
    3535#include <iprt/thread.h>
     36#include <iprt/net.h>
    3637
    3738#ifdef IN_RING0
     
    224225#endif
    225226
     227/**
     228 * Gets the address of the other party.
     229 *
     230 * @returns IPRT status code.
     231 * @param   Sock            Socket descriptor.
     232 * @param   pAddr           Where to store the peer address on success.
     233 */
     234RTR3DECL(int) RTTcpGetPeerAddress(RTSOCKET Sock, PRTNETADDR pAddr);
    226235
    227236/** @} */
  • trunk/src/VBox/Runtime/common/string/strformatrt.cpp

    r26351 r26588  
    5252 *      - \%RTldrm          - Takes a #RTLDRMOD value.
    5353 *      - \%RTmac           - Takes a #PCRTMAC pointer.
     54 *      - \%RTnaddr         - Takes a #PCRTNETADDR value.
    5455 *      - \%RTnaipv4        - Takes a #RTNETADDRIPV4 value.
    5556 *      - \%RTnaipv6        - Takes a #PCRTNETADDRIPV6 value.
     
    215216                    RTSF_IPV6,
    216217                    RTSF_MAC,
     218                    RTSF_NETADDR,
    217219                    RTSF_UUID
    218220                } RTSF;
     
    266268                    { STRMEM("Tldrm"),   sizeof(RTLDRMOD),       16, RTSF_INTW,  0 },
    267269                    { STRMEM("Tmac"),    sizeof(PCRTMAC),        16, RTSF_MAC,   0 },
     270                    { STRMEM("Tnaddr"),  sizeof(PCRTNETADDR),    10, RTSF_NETADDR,0 },
    268271                    { STRMEM("Tnaipv4"), sizeof(RTNETADDRIPV4),  10, RTSF_IPV4,  0 },
    269272                    { STRMEM("Tnaipv6"), sizeof(PCRTNETADDRIPV6),16, RTSF_IPV6,  0 },
     
    316319                    RTNETADDRIPV4       Ipv4Addr;
    317320                    PCRTNETADDRIPV6     pIpv6Addr;
     321                    PCRTNETADDR         pNetAddr;
    318322                    PCRTUUID            pUuid;
    319323                } u;
     
    532536                    }
    533537
     538                    case RTSF_NETADDR:
     539                    {
     540                        if (VALID_PTR(u.pNetAddr))
     541                        {
     542                            switch (u.pNetAddr->enmType)
     543                            {
     544                                case RTNETADDRTYPE_IPV4:
     545                                    if (u.pNetAddr->uPort == RTNETADDR_PORT_NA)
     546                                        return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0,
     547                                                           "%u.%u.%u.%u",
     548                                                           u.pNetAddr->uAddr.IPv4.au8[0],
     549                                                           u.pNetAddr->uAddr.IPv4.au8[1],
     550                                                           u.pNetAddr->uAddr.IPv4.au8[2],
     551                                                           u.pNetAddr->uAddr.IPv4.au8[3]);
     552                                    return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0,
     553                                                       "%u.%u.%u.%u:%u",
     554                                                       u.pNetAddr->uAddr.IPv4.au8[0],
     555                                                       u.pNetAddr->uAddr.IPv4.au8[1],
     556                                                       u.pNetAddr->uAddr.IPv4.au8[2],
     557                                                       u.pNetAddr->uAddr.IPv4.au8[3],
     558                                                       u.pNetAddr->uPort);
     559
     560                                case RTNETADDRTYPE_IPV6:
     561                                    if (u.pNetAddr->uPort == RTNETADDR_PORT_NA)
     562                                        return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0,
     563                                                           "%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x",
     564                                                           u.pNetAddr->uAddr.IPv6.au8[0],
     565                                                           u.pNetAddr->uAddr.IPv6.au8[1],
     566                                                           u.pNetAddr->uAddr.IPv6.au8[2],
     567                                                           u.pNetAddr->uAddr.IPv6.au8[3],
     568                                                           u.pNetAddr->uAddr.IPv6.au8[4],
     569                                                           u.pNetAddr->uAddr.IPv6.au8[5],
     570                                                           u.pNetAddr->uAddr.IPv6.au8[6],
     571                                                           u.pNetAddr->uAddr.IPv6.au8[7],
     572                                                           u.pNetAddr->uAddr.IPv6.au8[8],
     573                                                           u.pNetAddr->uAddr.IPv6.au8[9],
     574                                                           u.pNetAddr->uAddr.IPv6.au8[10],
     575                                                           u.pNetAddr->uAddr.IPv6.au8[11],
     576                                                           u.pNetAddr->uAddr.IPv6.au8[12],
     577                                                           u.pNetAddr->uAddr.IPv6.au8[13],
     578                                                           u.pNetAddr->uAddr.IPv6.au8[14],
     579                                                           u.pNetAddr->uAddr.IPv6.au8[15]);
     580                                    return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0,
     581                                                       "%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x %u",
     582                                                       u.pNetAddr->uAddr.IPv6.au8[0],
     583                                                       u.pNetAddr->uAddr.IPv6.au8[1],
     584                                                       u.pNetAddr->uAddr.IPv6.au8[2],
     585                                                       u.pNetAddr->uAddr.IPv6.au8[3],
     586                                                       u.pNetAddr->uAddr.IPv6.au8[4],
     587                                                       u.pNetAddr->uAddr.IPv6.au8[5],
     588                                                       u.pNetAddr->uAddr.IPv6.au8[6],
     589                                                       u.pNetAddr->uAddr.IPv6.au8[7],
     590                                                       u.pNetAddr->uAddr.IPv6.au8[8],
     591                                                       u.pNetAddr->uAddr.IPv6.au8[9],
     592                                                       u.pNetAddr->uAddr.IPv6.au8[10],
     593                                                       u.pNetAddr->uAddr.IPv6.au8[11],
     594                                                       u.pNetAddr->uAddr.IPv6.au8[12],
     595                                                       u.pNetAddr->uAddr.IPv6.au8[13],
     596                                                       u.pNetAddr->uAddr.IPv6.au8[14],
     597                                                       u.pNetAddr->uAddr.IPv6.au8[15],
     598                                                       u.pNetAddr->uPort);
     599
     600                                case RTNETADDRTYPE_MAC:
     601                                    return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0,
     602                                                       "%02x:%02x:%02x:%02x:%02x:%02x",
     603                                                       u.pNetAddr->uAddr.Mac.au8[0],
     604                                                       u.pNetAddr->uAddr.Mac.au8[1],
     605                                                       u.pNetAddr->uAddr.Mac.au8[2],
     606                                                       u.pNetAddr->uAddr.Mac.au8[3],
     607                                                       u.pNetAddr->uAddr.Mac.au8[4],
     608                                                       u.pNetAddr->uAddr.Mac.au8[5]);
     609
     610                                default:
     611                                    return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0,
     612                                                       "unsupported-netaddr-type=%u", u.pNetAddr->enmType);
     613
     614                            }
     615                        }
     616                        return pfnOutput(pvArgOutput, s_szNull, sizeof(s_szNull) - 1);
     617                    }
     618
    534619                    case RTSF_UUID:
    535620                    {
  • trunk/src/VBox/Runtime/r3/tcp.cpp

    r26252 r26588  
    910910
    911911
     912RTR3DECL(int) RTTcpGetPeerAddress(RTSOCKET Sock, PRTNETADDR pAddr)
     913{
     914    union
     915    {
     916        struct sockaddr     Addr;
     917        struct sockaddr_in  Ipv4;
     918        struct sockaddr_in6 Ipv6;
     919    }               u;
     920#ifdef RT_OS_WINDOWS
     921    int             cbAddr = sizeof(u);
     922#else
     923    socklen_t       cbAddr = sizeof(u);
     924#endif
     925    RT_ZERO(u);
     926    if (!getpeername(Sock, &u.Addr, &cbAddr))
     927    {
     928        /*
     929         * Convert the address.
     930         */
     931        if (   cbAddr == sizeof(struct sockaddr_in)
     932            && u.Addr.sa_family == AF_INET)
     933        {
     934            RT_ZERO(*pAddr);
     935            pAddr->enmType      = RTNETADDRTYPE_IPV4;
     936            pAddr->uPort        = u.Ipv4.sin_port;
     937            pAddr->uAddr.IPv4.u = u.Ipv4.sin_addr.s_addr;
     938        }
     939#ifdef AF_INET6
     940        else if (   cbAddr == sizeof(struct sockaddr_in6)
     941                 && u.Addr.sa_family == AF_INET6)
     942        {
     943            RT_ZERO(*pAddr);
     944            pAddr->enmType            = RTNETADDRTYPE_IPV6;
     945            pAddr->uPort              = u.Ipv6.sin6_port;
     946            pAddr->uAddr.IPv6.au32[0] = u.Ipv6.sin6_addr.s6_addr32[0];
     947            pAddr->uAddr.IPv6.au32[1] = u.Ipv6.sin6_addr.s6_addr32[1];
     948            pAddr->uAddr.IPv6.au32[2] = u.Ipv6.sin6_addr.s6_addr32[2];
     949            pAddr->uAddr.IPv6.au32[3] = u.Ipv6.sin6_addr.s6_addr32[3];
     950        }
     951#endif
     952        else
     953            return VERR_NET_ADDRESS_FAMILY_NOT_SUPPORTED;
     954        return VINF_SUCCESS;
     955    }
     956    return rtTcpError();
     957}
     958
     959
    912960RTR3DECL(int) RTTcpClientConnect(const char *pszAddress, uint32_t uPort, PRTSOCKET pSock)
    913961{
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette