您的位置:首页 > 编程语言 > C语言/C++

c/c++ 获取本机的IP和Mac地址

2017-04-12 11:37 519 查看
//根据需求修改网卡名称

//IpGetMac.cpp

#include <net/if.h>

#include <sys/ioctl.h>

#include <arpa/inet.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <string>

#define ETH_NAME    "eth0"  //如果要获取其他网卡的地址,将这个换为其他网卡名称,比如eth0

std::string get_ip();

void get_mac(char * mac_a);

int main()

{

    //ip

    std::string ip = get_ip();

    printf("ip: %s: ", ip.c_str());

    // mac address

    char * this_mac = new char[6];

    get_mac(this_mac);

    printf("mac: %02x:%02x:%02x:%02x:%02x:%02x\n", this_mac[0]&0xff, this_mac[1]&0xff, this_mac[2]&0xff, this_mac[3]&0xff, this_mac[4]&0xff, this_mac[5]&0xff);

    return 0;

}

std::string get_ip()

{

    int                 sockfd;

    struct sockaddr_in  sin;

    struct ifreq        ifr;

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    if (sockfd == -1) {

        perror("socket error");

        exit(1);

    }

    strncpy(ifr.ifr_name, ETH_NAME, IFNAMSIZ);      //Interface name

    if (ioctl(sockfd, SIOCGIFADDR, &ifr) == 0) {    //SIOCGIFADDR 获取interface address

        memcpy(&sin, &ifr.ifr_addr, sizeof(ifr.ifr_addr));

        return inet_ntoa(sin.sin_addr);

    }

}

void get_mac(char * mac_a)

{

    int                 sockfd;

    struct ifreq        ifr;

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    if (sockfd == -1) {

        perror("socket error");

        exit(1);

    }

    strncpy(ifr.ifr_name, ETH_NAME, IFNAMSIZ);      //Interface name

    if (ioctl(sockfd, SIOCGIFHWADDR, &ifr) == 0) {  //SIOCGIFHWADDR 获取hardware address

        memcpy(mac_a, ifr.ifr_hwaddr.sa_data, 6);

    }
}

//编译 g++ -o IpGetMac IpGetMac.cpp
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: