• 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;因为结构体字节大小相同。

  • 相关阅读:
    仿IOS中下拉刷新的“雨滴”效果
    BZOJ 4216 Pig 分块乱搞
    mybatis学习笔记(10)-一对一查询
    关于人性,我是这么看的——“唯进化”论!
    IDEA引MAVEN项目jar包依赖导入问题解决
    IntelliJ IDEA 缓存和索引介绍和清理方法
    springboot整合mybatis使用阿里(阿里连接池)和xml方式
    Intellij 如何在新窗口中打开项目
    intellij idea 在什么地方打开终端Terminal
    Spring Boot 集成MyBatis
  • 原文地址:https://www.cnblogs.com/yunqie/p/6103316.html
Copyright © 2020-2023  润新知