GetIPAddress——获得本地IP地址信息

1.gethostname()需要初始化套接字库 加载#pragma comment(lib,"ws2_32.lib"),和WSAStartup(MAKEWORD(2,2),&wsaData)函数

2.IP_ADAPTER_INFO结构包含了网络适配器的信息

typedef struct _IP_ADAPTER_INFO {
struct _IP_ADAPTER_INFO* Next; //指向下一个适配器
DWORD ComboIndex; //保留字段
char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4]; //适配器名称
char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4]; //对适配器的描述
UINT AddressLength; //MAC地址的长度(6字节)
BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH]; //MAC地址
DWORD Index; //适配器索引
UINT Type; //适配器类型
UINT DhcpEnabled; //指定此适配是否有效了DHCP(动态主机配置)协议
PIP_ADDR_STRING CurrentIpAddress; //保留字段
IP_ADDR_STRING IpAddressList; //与此适配器相关的ip列表
IP_ADDR_STRING GatewayList; //网关地址列表
IP_ADDR_STRING DhcpServer; //DHCP服务器
BOOL HaveWins; //指定此适配器是否使用WINS(Windows Internet名称服务)
IP_ADDR_STRING PrimaryWinsServer; //WINS服务器的主IP
IP_ADDR_STRING SecondaryWinsServer; //第二IP
time_t LeaseObtained; //当前DHCP租用时间
time_t LeaseExpires; //当前DHCP租用期满的时间
} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;

3.获取本地机器的适配器信息

GetAdaptersInfo(
__out_bcount_opt(*SizePointer) PIP_ADAPTER_INFO AdapterInfo, //指向一个缓冲区用来存放IP_ADAPTER_INFO列表
__inout PULONG SizePointer //指定上方缓冲区的大小,不够则返回需要的大小
); //此函数调用成功返回ERROR_SUCCESS

实现代码

#include "stdafx.h"
#include <WinSock2.h>
#include <windows.h>
#include "Iphlpapi.h"
#include <stdio.h>
#include <iostream>

#pragma comment(lib, "Iphlpapi.lib")
#pragma comment(lib, "WS2_32.lib")

#pragma comment(lib,"ws2_32.lib")
using namespace std;

BOOL InitSock();
BOOL GetAllIp();
BOOL GetGlobalData();

// 全局数据
u_char    g_ucLocalMac[6];           // 本地MAC地址
DWORD    g_dwGatewayIP;        // 网关IP地址
DWORD    g_dwLocalIP;               // 本地IP地址
DWORD    g_dwMask;            // 子网掩码

void main()
{
    InitSock();
    GetAllIp();
    GetGlobalData();
}

BOOL InitSock()
{
    WSAData wsaData = {0};
    if(WSAStartup(MAKEWORD(2,2),&wsaData)==0)
    {
        return TRUE;
    }

    return FALSE;
}

BOOL GetAllIp()
{
    char szHost[256] = {0};
    gethostname(szHost,256);//获取本地主机名     

    HOSTENT *pHost = gethostbyname(szHost);//通过主机名过得地址信息
    if (szHost==NULL)  //打印出所有IP地址
    {
        cout<<"error"<<endl;
    }
    in_addr addr;
    for(int i = 0; ;i++)
    {
        char *p = pHost->h_addr_list[i];
        if(p == NULL)
            break;

        memcpy(&addr.S_un.S_addr,p,pHost->h_length);
        char *szIP = inet_ntoa(addr);
        cout<<"The LocalAddress:"<<szIP<<endl;
    }

    /*char ip[256] = {0};
    strcpy(ip,inet_ntoa(*(in_addr*)*pHost->h_addr_list));

    cout<<"The LocalAddress:"<<ip<<endl;*/
    system("PAUSE");
    return TRUE;

}

BOOL GetGlobalData()
{
    PIP_ADAPTER_INFO pAdapterInfo = NULL;
    ULONG ulLen = 0;

    // 为适配器结构申请内存
    GetAdaptersInfo(pAdapterInfo,&ulLen);
    pAdapterInfo = (PIP_ADAPTER_INFO)::GlobalAlloc(GPTR, ulLen);

    // 取得本地适配器结构信息

        if(::GetAdaptersInfo(pAdapterInfo,&ulLen) ==  ERROR_SUCCESS)
        {
        if(pAdapterInfo != NULL)
            {
                for(pAdapterInfo = pAdapterInfo;pAdapterInfo != NULL;pAdapterInfo = pAdapterInfo->Next)
                {
                memcpy(g_ucLocalMac, pAdapterInfo->Address, 6);
                g_dwGatewayIP = ::inet_addr(pAdapterInfo->GatewayList.IpAddress.String);
                g_dwLocalIP = ::inet_addr(pAdapterInfo->IpAddressList.IpAddress.String);
                g_dwMask = ::inet_addr(pAdapterInfo->IpAddressList.IpMask.String);

                printf(" \n -------------------- 本地主机信息 -----------------------\n\n");
    in_addr in;
    in.S_un.S_addr = g_dwLocalIP;
    printf("      IP Address : %s \n", ::inet_ntoa(in));

    in.S_un.S_addr = g_dwMask;
    printf("     Subnet Mask : %s \n", ::inet_ntoa(in));

    in.S_un.S_addr = g_dwGatewayIP;
    printf(" Default Gateway : %s \n", ::inet_ntoa(in));

    u_char *p = g_ucLocalMac;
    printf("     MAC Address : %02X-%02X-%02X-%02X-%02X-%02X \n", p[0], p[1], p[2], p[3], p[4], p[5]);

    printf(" \n \n ");
    pAdapterInfo = pAdapterInfo->Next ;
            }
        }

    }

    getchar();

    return TRUE;
}
时间: 2024-12-11 15:17:12

GetIPAddress——获得本地IP地址信息的相关文章

JS读取本地IP地址信息

HTML <div> <p>点击下面的按钮,查看本地IP信息</p> <span class="span">点击查看</span> <p class="cip"></p> <p class="cid"></p> <p class="cname"></p> </div> CSS html

C#获取本地IP地址,内网+外网方法

1 #region 获取内.外网Ip 2 3 /// <summary> 4 /// 获取本地ip地址,优先取内网ip 5 /// </summary> 6 public static String GetLocalIp() 7 { 8 String[] Ips = GetLocalIpAddress(); 9 10 foreach (String ip in Ips) if (ip.StartsWith("10.80.")) return ip; 11 for

Linux下编程获取本地IP地址的常见方法

转载于:http://blog.csdn.net/k346k346/article/details/48231933 在进行linux网络编程时,经常用到本机IP地址.本文罗列一下常见方法,以备不时之需. 获取本机IP地址,是一个相当灵活的操作,原因是网络地址的设置非常灵活而且都是允许用户进行个性化设置的.比如一台计算机上可以有多块物理网卡或者虚拟网卡,一个网卡上可以绑定多个IP地址,用户可以为网卡设置别名,可以重命名网卡.用户计算机所在网络拓扑结构未知,主机名设置是一个可选项,并且同样可以为一

获取客户端、服务器、本地IP地址

//获取客户端.服务器.本地IP地址 public static string getIPAddress() { ////本地IP //string address = System.Net.Dns.GetHostAddresses(System.Net.Dns.GetHostName()).GetValue(2).ToString();//IP4 地址 ////本地电脑名称 //string addname = System.Net.Dns.GetHostName().ToString();

Linux C 网络编程 - 获取本地 ip 地址,mac,通过域名获取对应的 ip

获取本地 ip 地址,mac,通过域名获取对应的 ip, 是网络编程可能遇到的比较常见的操作了,所以总结如下(封装了3个函数), 直接上代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <netdb.h> #include <net/if.h> #inc

Android获取本地IP地址,Ipv4地址检查,Ipv6地址检查

/** * 获取本地IP地址 * @author YOLANDA * @return */ public static String getLocalIPAddress() { String ipAddress = ""; try { Enumeration<NetworkInterface> netfaces = NetworkInterface.getNetworkInterfaces(); // 遍历所用的网络接口 while (netfaces.hasMoreEle

Oracle 使用本地IP地址连接异常的解决方法

前几天的安装的Oracle测试环境,今天发现不能使用本地IP连接,连接提示错误 "Oracle the network adapter could not establish the connection" 这个问题折腾我时间比较长,网上很多资料都不太适合我的情况.不过最后还是被找到了 花了很多时间在其他方面没有锁定问题根源. 1 开始以为是防火墙 server client端都排除 2 oracle client端问题 (ubuntu 安装的client端) 3 最后用程序测试发现还

sqlserver服务器名称改成本地IP地址登录

原文:sqlserver服务器名称改成本地IP地址登录 在安装sqlserver2008.2012等时选择的是默认实例,服务器名称也就是电脑的名称,特别是登录本地的数据库,需要输入电脑用户名称加上SQLEXPRESS 例如:zhangsan\SQLEXPRESS 而不是自己本机的ip地址:192.168.1.xx  内部网络别的电脑也无法访问. 问题就来了,如何修改服务器名称呢,改成用本地IP或者用户名\SQLEXPRESS登录sqlserver? 解决办法: 1.开始程序=>Microsoft

[Xcode10 实际操作]八、网络与多线程-(11)使用同步Post方式查询IP地址信息

本文将演示如何通过Post请求,同步获取IP地址信息. 一旦发送同步请求,程序将停止用户交互,直至服务器返回数据. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 1 import UIKit 2 3 class ViewController: UIViewController { 4 5 //给当前视图控制器类,添加一个标签属性. 6 //该标签对象,将用来显示远程服务器返回的信息 7 var label = UILabel() 8 9 override f