www.pudn.com > LiServer.rar > resolve.cpp


// 
// Common routines for resolving addresses and hostnames 
// 
// Files: 
//      resolve.cpp     - Common routines 
//      resolve.h       - Header file for common routines 
// 
// Description: 
//      This file contains common name resolution and name printing 
//      routines and is used by many of the samples on this CD. 
// 
// Compile: 
//      See iocpserver.cpp 
// 
// Usage: 
//      See iocpserver.cpp 
// 
#include "My.h" 
#include  
#include  
#include  
#include  
 
#include "resolve.h" 
 
#include "CMsgAnalyse.h" 
// 
// Function: PrintAddress 
// 
// Description: 
//    This routine takes a SOCKADDR structure and its length and prints 
//    converts it to a string representation. This string is printed 
//    to the console via stdout. 
// 
int PrintAddress(SOCKADDR *sa, int salen) 
{ 
    char    host[NI_MAXHOST], 
            serv[NI_MAXSERV]; 
    int     hostlen = NI_MAXHOST, 
            servlen = NI_MAXSERV, 
            rc; 
 
    rc = getnameinfo( 
            sa, 
            salen, 
            host, 
            hostlen, 
            serv, 
            servlen, 
            NI_NUMERICHOST | NI_NUMERICSERV 
            ); 
    if (rc != 0) 
    { 
        fprintf(stderr, "%s: getnameinfo failed: %d\n", __FILE__, rc); 
        return rc; 
    } 
 
    // If the port is zero then don't print it 
    if (strcmp(serv, "0") != 0) 
    { 
        if (sa->sa_family == AF_INET) 
            printf("[%s]:%s", host, serv); 
        else 
            printf("%s:%s", host, serv); 
    } 
    else 
        printf("%s", host); 
 
    return NO_ERROR; 
} 
 
// 
// Function: FormatAddress 
// 
// Description: 
//    This is similar to the PrintAddress function except that instead of 
//    printing the string address to the console, it is formatted into 
//    the supplied string buffer. 
// 
int FormatAddress(SOCKADDR *sa, int salen, char *addrbuf, int addrbuflen) 
{ 
    char    host[NI_MAXHOST], 
            serv[NI_MAXSERV]; 
    int     hostlen = NI_MAXHOST, 
            servlen = NI_MAXSERV, 
            rc; 
 
    rc = getnameinfo( 
            sa, 
            salen, 
            host, 
            hostlen, 
            serv, 
            servlen, 
            NI_NUMERICHOST | NI_NUMERICSERV 
            ); 
    if (rc != 0) 
    { 
        fprintf(stderr, "%s: getnameinfo failed: %d\n", __FILE__, rc); 
        return rc; 
    } 
    if ( (strlen(host) + strlen(serv) + 1) > (unsigned)addrbuflen) 
        return WSAEFAULT; 
    if (sa->sa_family == AF_INET) 
        sprintf(addrbuf, "%s:%s", host, serv); 
    else if (sa->sa_family == AF_INET6) 
        sprintf(addrbuf, "[%s]:%s", host, serv); 
    else 
        addrbuf[0] = '\0'; 
 
    return NO_ERROR; 
} 
 
// 
// Function: ResolveAddress 
// 
// Description: 
//    This routine resolves the specified address and returns a list of addrinfo 
//    structure containing SOCKADDR structures representing the resolved addresses. 
//    Note that if 'addr' is non-NULL, then getaddrinfo will resolve it whether 
//    it is a string listeral address or a hostname. 
// 
struct addrinfo *ResolveAddress(char *addr, char *port, int af, int type, int proto) 
{ 
    struct addrinfo hints, 
    *res = NULL; 
    int             rc; 
 
    memset(&hints, 0, sizeof(hints)); 
    hints.ai_flags  = ((addr) ? 0 : AI_PASSIVE); 
    hints.ai_family = af; 
    hints.ai_socktype = type; 
    hints.ai_protocol = proto; 
 
    rc = getaddrinfo( 
            addr, 
            port, 
           &hints, 
           &res 
            ); 
    if (rc != 0) 
    { 
        printf("Invalid address %s, getaddrinfo failed: %d\n", addr, rc); 
        return NULL; 
    } 
    return res; 
}