📄 socketaddr.c
字号:
memcpy(&(((struct sockaddr_in*)inSockAddr)->sin_addr), *(hostP->h_addr_list), (hostP->h_length)); }#endif}// end setHostname/* ------------------------------------------------------------------- * Copy the IP address into the string. * ------------------------------------------------------------------- */void SockAddr_getHostAddress( iperf_sockaddr *inSockAddr, char* outAddress, size_t len ) { if ( ((struct sockaddr*)inSockAddr)->sa_family == AF_INET ) { inet_ntop( AF_INET, &(((struct sockaddr_in*) inSockAddr)->sin_addr), outAddress, len); }#ifdef HAVE_IPV6 else { inet_ntop( AF_INET6, &(((struct sockaddr_in6*) inSockAddr)->sin6_addr), outAddress, len); }#endif}// end getHostAddress/* ------------------------------------------------------------------- * Set the address to any (generally all zeros). * ------------------------------------------------------------------- */void SockAddr_setAddressAny( iperf_sockaddr *inSockAddr ) { if ( ((struct sockaddr*)inSockAddr)->sa_family == AF_INET ) memset( &(((struct sockaddr_in*) inSockAddr)->sin_addr), 0, sizeof( struct in_addr ));#if defined(HAVE_IPV6) else memset( &(((struct sockaddr_in6*) inSockAddr)->sin6_addr), 0, sizeof( struct in6_addr ));#endif}// end setAddressAny/* ------------------------------------------------------------------- * Set the port to the given port. Handles the byte swapping. * ------------------------------------------------------------------- */void SockAddr_setPort( iperf_sockaddr *inSockAddr, unsigned short inPort ) { if ( ((struct sockaddr*)inSockAddr)->sa_family == AF_INET ) ((struct sockaddr_in*) inSockAddr)->sin_port = htons( inPort );#if defined(HAVE_IPV6) else ((struct sockaddr_in6*) inSockAddr)->sin6_port = htons( inPort );#endif}// end setPort/* ------------------------------------------------------------------- * Set the port to zero, which lets the OS pick the port. * ------------------------------------------------------------------- */void SockAddr_setPortAny( iperf_sockaddr *inSockAddr ) { SockAddr_setPort( inSockAddr, 0 );}// end setPortAny/* ------------------------------------------------------------------- * Return the port. Handles the byte swapping. * ------------------------------------------------------------------- */unsigned short SockAddr_getPort( iperf_sockaddr *inSockAddr ) { if ( ((struct sockaddr*)inSockAddr)->sa_family == AF_INET ) return ntohs( ((struct sockaddr_in*) inSockAddr)->sin_port );#if defined(HAVE_IPV6) else return ntohs( ((struct sockaddr_in6*) inSockAddr)->sin6_port);#endif return 0;}// end getPort/* ------------------------------------------------------------------- * Return the IPv4 Internet Address from the sockaddr_in structure * ------------------------------------------------------------------- */struct in_addr* SockAddr_get_in_addr( iperf_sockaddr *inSockAddr ) { if ( ((struct sockaddr*)inSockAddr)->sa_family == AF_INET ) return &(((struct sockaddr_in*) inSockAddr)->sin_addr); fprintf(stderr, "FATAL: get_in_addr called on IPv6 address\n"); return NULL;}/* ------------------------------------------------------------------- * Return the IPv6 Internet Address from the sockaddr_in6 structure * ------------------------------------------------------------------- */#ifdef HAVE_IPV6struct in6_addr* SockAddr_get_in6_addr( iperf_sockaddr *inSockAddr ) { if ( ((struct sockaddr*)inSockAddr)->sa_family == AF_INET6 ) return &(((struct sockaddr_in6*) inSockAddr)->sin6_addr); fprintf(stderr, "FATAL: get_in6_addr called on IPv4 address\n"); return NULL;}#endif/* ------------------------------------------------------------------- * Return the size of the appropriate address structure. * ------------------------------------------------------------------- */Socklen_t SockAddr_get_sizeof_sockaddr( iperf_sockaddr *inSockAddr ) {#if defined(HAVE_IPV6) if ( ((struct sockaddr*)inSockAddr)->sa_family == AF_INET6 ) { return(sizeof(struct sockaddr_in6)); }#endif return(sizeof(struct sockaddr_in));}// end get_sizeof_sockaddr/* ------------------------------------------------------------------- * Return if IPv6 socket * ------------------------------------------------------------------- */int SockAddr_isIPv6( iperf_sockaddr *inSockAddr ) {#if defined(HAVE_IPV6) if ( ((struct sockaddr*)inSockAddr)->sa_family == AF_INET6 ) { return 1; }#endif return 0;}// end get_sizeof_sockaddr/* ------------------------------------------------------------------- * Return true if the address is a IPv4 multicast address. * ------------------------------------------------------------------- */int SockAddr_isMulticast( iperf_sockaddr *inSockAddr ) {#if defined(HAVE_IPV6) if ( ((struct sockaddr*)inSockAddr)->sa_family == AF_INET6 ) { return( IN6_IS_ADDR_MULTICAST(&(((struct sockaddr_in6*) inSockAddr)->sin6_addr) )); } else#endif { // 224.0.0.0 to 239.255.255.255 (e0.00.00.00 to ef.ff.ff.ff) const unsigned long kMulticast_Mask = 0xe0000000L; return(kMulticast_Mask == (ntohl( ((struct sockaddr_in*) inSockAddr)->sin_addr.s_addr) & kMulticast_Mask)); }}// end isMulticast/* ------------------------------------------------------------------- * Zero out the address structure. * ------------------------------------------------------------------- */void SockAddr_zeroAddress( iperf_sockaddr *inSockAddr ) { memset( inSockAddr, 0, sizeof( iperf_sockaddr ));}// zeroAddress/* ------------------------------------------------------------------- * Compare two sockaddrs and return true if they are equal * ------------------------------------------------------------------- */int SockAddr_are_Equal( struct sockaddr* first, struct sockaddr* second ) { if ( first->sa_family == AF_INET && second->sa_family == AF_INET ) { // compare IPv4 adresses return( ((long) ((struct sockaddr_in*)first)->sin_addr.s_addr == (long) ((struct sockaddr_in*)second)->sin_addr.s_addr) && ( ((struct sockaddr_in*)first)->sin_port == ((struct sockaddr_in*)second)->sin_port) ); }#if defined(HAVE_IPV6) if ( first->sa_family == AF_INET6 && second->sa_family == AF_INET6 ) { // compare IPv6 addresses return( !memcmp(((struct sockaddr_in6*)first)->sin6_addr.s6_addr, ((struct sockaddr_in6*)second)->sin6_addr.s6_addr, sizeof(struct in6_addr)) && (((struct sockaddr_in6*)first)->sin6_port == ((struct sockaddr_in6*)second)->sin6_port) ); }#endif return 0;}/* ------------------------------------------------------------------- * Compare two sockaddrs and return true if the hosts are equal * ------------------------------------------------------------------- */int SockAddr_Hostare_Equal( struct sockaddr* first, struct sockaddr* second ) { if ( first->sa_family == AF_INET && second->sa_family == AF_INET ) { // compare IPv4 adresses return( (long) ((struct sockaddr_in*)first)->sin_addr.s_addr == (long) ((struct sockaddr_in*)second)->sin_addr.s_addr); }#if defined(HAVE_IPV6) if ( first->sa_family == AF_INET6 && second->sa_family == AF_INET6 ) { // compare IPv6 addresses return( !memcmp(((struct sockaddr_in6*)first)->sin6_addr.s6_addr, ((struct sockaddr_in6*)second)->sin6_addr.s6_addr, sizeof(struct in6_addr))); }#endif return 0;}#ifdef __cplusplus} /* end extern "C" */#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -