zoukankan      html  css  js  c++  java
  • 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;因为结构体字节大小相同。

  • 相关阅读:
    ElasticSearch第三步-中文分词
    centos 6.7 搭建tornado + nginx + supervisor的方法(已经实践)
    python ConfigParser 模块
    collections 模块(namedtuple, deque, Counter )
    Kali 开机报错解决方案
    debian 或者kali 安装git
    kali python pip3 的安装和卸载
    Kali 使用ssh,安装vmware tools 和字体重叠
    装饰器
    python2.7 报错(UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128))
  • 原文地址:https://www.cnblogs.com/yunqie/p/6103316.html
Copyright © 2011-2022 走看看