加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C++在windows下获取本地主机ipv4地址和ipv6地址

发布时间:2020-12-16 07:44:07 所属栏目:百科 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 C++在windows下获取本地主机ipv4地址和ipv6地址 #include Winsock2.h#include stdio.h#include iostream#include cstring#includews2tcpip.h#pragma c

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

C++在windows下获取本地主机ipv4地址和ipv6地址
#include <Winsock2.h>
#include <stdio.h>
#include <iostream>
#include <cstring>
#include<ws2tcpip.h>
#pragma comment(lib,"ws2_32.lib ")  //linking to the library
using namespace std;
int get_ip()
{
    struct addrinfo *ailist,*aip;       
    struct addrinfo hint;       
    struct sockaddr_in6 *sinp6; 
    PHOSTENT hostinfo;
    char hostname[255] = {0};      //主机名  
    char *port = "3294";                              //端口号
    const char *addr;       
    int ilRc;
    gethostname(hostname,sizeof(hostname));
    if((hostinfo = gethostbyname(hostname)) == NULL)    //获得本地ipv4地址
    {
        errno = GetLastError();
        fprintf(stderr,"gethostbyname Error:%dn",errno);
        return 1;
    }
    LPCSTR ip;
    while(*(hostinfo->h_addr_list) != NULL)        //输出ipv4地址
    {
        ip = inet_ntoa(*(struct in_addr *) *hostinfo->h_addr_list);
        printf("ipv4 addr = %snn",ip);
        hostinfo->h_addr_list++;
    }
    hint.ai_family = AF_INET6;                   /*  hint 的限定设置  */
    hint.ai_socktype = SOCK_STREAM;     /*   这里可是设置 socket type    比如  SOCK——DGRAM */
    hint.ai_flags = AI_PASSIVE;                    // flags 的标志很多  。常用的有AI_CANONNAME;
    hint.ai_protocol = 0;                               /*  设置协议  一般为0,默认 */        
    hint.ai_addrlen = 0;                                /*  下面不可以设置,为0,或者为NULL  */
    hint.ai_canonname = NULL;       
    hint.ai_addr = NULL;       
    hint.ai_next = NULL;
    ilRc = getaddrinfo(hostname,port,&hint,&ailist);    /*通过主机名获得地址信息*/     
    if (ilRc < 0)       
    {              
        char str_error[100];               
        strcpy(str_error,(char *)gai_strerror(errno));               
        printf("str_error = %s",str_error);               
        return 0;       
    }
    if(ailist == NULL)
    {
        printf("sorry not find the IP address,please try again n");
    }
    for (aip = ailist; aip != NULL; aip = aip->ai_next)                         /* 显示获取的信息  */
    {                      
        aip->ai_family == AF_INET6;
        sinp6 = (struct sockaddr_in6 *)aip->ai_addr;                                  /* 为什么是for 循环 ,先向下看 */
        int i;
        printf("ipv6 addr = ");
        for(i = 0; i < 16; i++)
        {
            if(((i-1)%2) && (i>0))
            {
                printf(":");
            }
            printf("%02x",sinp6->sin6_addr.u.Byte[i]);    
        }
        printf(" n");
        printf(" n"); 
    }
    while(1);  
}
int main(){
 
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;   
    wVersionRequested = MAKEWORD( 1,1 );
    err = WSAStartup( wVersionRequested,&wsaData );//initiate the ws2_32.dll and match the version
    if ( err != 0 )
    {
        return 0;
    }
    if ( LOBYTE( wsaData.wVersion ) != 1 ||   //if the version is not matched,then quit and terminate the ws3_32.dll
        HIBYTE( wsaData.wVersion ) != 1 )
    {
        WSACleanup( );
        return 0;
    }
    get_ip();
    return 0;
}

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读