Getaddrinfo()笔记

WSADATA dwRetval;
if (WSAStartup(MAKEWORD(2,2),&dwRetval)!=0)    //开启Socket
{
printf("WSAStartup failed. ");
return 1;
}

void CGetHostNameDlg::OnGetHostNameIP()
{
char   szHostname[128];
char   *ipName = new char[16];  //存放IP
struct addrinfo   *result = NULL;     //指向addrinfo链表
struct addrinfo   *ptr     = NULL;
struct addrinfo    hints;       //标识获取的信息
int      error;

UpdateData();           //将控件的值赋值给成员变量
gethostname(szHostname,128);
m_strName = szHostname;
struct sockaddr_in *sockaddr_ipv4;

// Setup the hints address info structure
// which is passed to the getaddrinfo() function
ZeroMemory(&hints,sizeof(hints));
hints.ai_family = AF_INET;        //指示IP类型(若用AF_UNSPEC不能得到本地地址
hints.ai_protocol = IPPROTO_UDP;     //指示协议类型
hints.ai_socktype = SOCK_DGRAM;     //套接字类型

error = getaddrinfo(szHostname,NULL,&hints,&result);
if (error!=0)
{
printf("getaddrinfo failed with error: %d ", error);
WSACleanup();
exit(1);
}

for (ptr = result; ptr != NULL;ptr=ptr->ai_next)
{
sockaddr_ipv4 = (sockaddr_in *)ptr->ai_addr;
}

// m_strIP =inet_ntoa( sockaddr_ipv4->sin_addr);  //已经不用
m_strIP = InetNtop(AF_INET, &sockaddr_ipv4->sin_addr ,(PWSTR)ipName,16);
UpdateData(false);      //将成员变量的值赋值控件

freeaddrinfo(result);       //Free a list of address information structures
WSACleanup();        //调用WSACleanup(),将其从Windows Sockets的实现中注销,并且该实现释放为应用程序或DLL分配的任何资源.任何打开的并已建立连接的SOCK_STREAM类型套接口在调用WSACleanup()时会重置; 而已经由closesocket()关闭却仍有要发送的悬而未决数据的套接口则不会受影响- 该数据仍要发送.

}

struct sockaddr_in{  

short sin_family;

unsigned short sin_port;

struct in_addr sin_addr;

char sin_zero[8];  

};  

参数

sin_family
地址系列(必须是 AF_INET)。

sin_port
IP 端口。

sin_addr
IP 地址。

sin_zero
填充结构使其与 SOCKADDR 的大小一致。

struct sockaddr {

unsigned short sa_family;  

char sa_data[14];

};  

struct sockaddr 和 sockaddr_in 可相互转换,sockaddr_ipv4 = (sockaddr_in *)ptr->ai_addr;因为结构体字节大小相同。

原文地址:https://www.cnblogs.com/yunqie/p/6103316.html