getaddrinfo()

//getaddrinfo()函数原型
WINSOCK_API_LINKAGE
INT
WSAAPI
getaddrinfo(
    _In_opt_        PCSTR               pNodeName,    //节点名可以是主机名,也可以是数字地址。(IPV4的10进点分,或是IPV6的16进制)
    _In_opt_        PCSTR               pServiceName, //包含十进制数的端口号或服务名如(ftp,http)
    _In_opt_        const ADDRINFOA *   pHints,       //是一个空指针或指向addrinfo结构的指针,由调用者填写关于它所想返回的信息类型的线索
    _Outptr_        PADDRINFOA *        ppResult      //存放返回addrinfo结构链表的指针
    );
//调用该函数会获得一个addrinfo结构的列表,调用的返回值是addrinfo的结构(列表)指针。

//addrinfo结构原型
typedef struct addrinfo {     int                 ai_flags;       // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST     int                 ai_family;      // PF_xxx ,AF_INET,AF_INET6,AF_UNSPEC     int                 ai_socktype;    // SOCK_xxx ,SOCK_STREAM,SOCK_DGRAM     int                 ai_protocol;    // 0 or IPPROTO_xxx for IPv4 and IPv6 ,IPPROTO_IP, IPPROTO_IPV4, IPPROTO_IPV6 etc.     size_t              ai_addrlen;     // Length of ai_addr     char *              ai_canonname;   // Canonical name for nodename     _Field_size_bytes_(ai_addrlen) struct sockaddr *   ai_addr;        // Binary address     struct addrinfo *   ai_next;        // Next structure in linked list } ADDRINFOA, *PADDRINFOA;

 由getaddrinfo返回的所有存储空间都是动态获取的,这些存储空间必须通过调用freeaddrinfo返回给系统。

//freeaddrinfo()函数原型
WINSOCK_API_LINKAGE VOID WSAAPI freeaddrinfo( _In_opt_ PADDRINFOA pAddrInfo );
//getaddrinfo()函数示例

 char host_name[20] = "";
 gethostname(host_name, 20);

 ADDRINFOA hint, *pAddrinfo;
 memset(&hint, 0, sizeof(ADDRINFOA));
 hint.ai_family = AF_INET;
 hint.ai_socktype = SOCK_STREAM;
 hint.ai_protocol = IPPROTO_TCP;
 hint.ai_flags = AI_PASSIVE;
 int ret = getaddrinfo(host_name, "3050", &hint, &pAddrinfo);
 if (ret!=0)
 {
  AfxMessageBox(_T("获得主机IP失败"));
  return;
 }

 SOCKET socket_server = socket(pAddrinfo->ai_family, pAddrinfo->ai_socktype, pAddrinfo->ai_protocol);
 bind(socket_server, pAddrinfo->ai_addr, pAddrinfo->ai_addrlen);

原文地址:https://www.cnblogs.com/zhoudingcocng/p/6483430.html