YOGYUI

C++::Linux에서 네트워크 어댑터 MAC Address 가져오기 본문

Software/C, C++

C++::Linux에서 네트워크 어댑터 MAC Address 가져오기

요겨 2022. 7. 27. 09:20
반응형

C++: Get MAC Address of Network Adapter in Linux

 

인터넷 관련 코딩 작업을 하다보면 서버에 접속된 네트워크 어댑터의 정보를 확인해야하는 경우가 종종 생긴다

Linux OS 환경에서 네트워크 어댑터의 MAC(Media Access Control) 주소를 알아내는 간단한 방법을 알아본 뒤, 이를 C++로 구현해보자 (MAC address에 관한 간략한 설명은 위키피디아 참고)

※ Ubuntu 20.04.4 LTS 환경에서 구현 및 테스트

 

1. 터미널 명령어

/sys/class/net/ 디렉터리 내부를 살펴보자 (ls 명령어)

$ ls /sys/class/net

PC에 장착된 네트워크 어댑터의 이름들이 보인다

특정 어댑터의 내부 정보 목록들을 마찬가지로 ls 명령어로 살펴보자

$ ls /sys/class/net/enx106530b918ca

이중에서 MAC 주소는 'address'를 조회하면 얻을 수 있다 (cat 명령어)

$ cat /sys/class/net/enx106530b918ca/address

 

존재하는 모든 어댑터에 대한 다양한 정보들은 ifconfig 명령어로 가져올 수 있다 (/sys/class/net/에서 얻을 수 있는 정보들을 나열한 것이라고 이해하면 된다)

 

2. 코드 구현

어댑터의 이름을 담은 문자열과 1바이트 정수 배열(길이 6)을 인자로 입력받아 배열에 MAC 주소값을 대입하는 함수를 만들어보자

#include <string>
#include <regex>
#include <fstream>
#include <streambuf>

#define MAC_ADDR_LEN 6

bool get_mac_address(const std::string& if_name, uint8_t *mac_addr_buf) {
    std::string mac_addr;
    std::ifstream iface("/sys/class/net/" + if_name + "/address");
    std::string str((std::istreambuf_iterator<char>(iface)), std::istreambuf_iterator<char>());
    if (str.length() > 0) {
        std::string hex = regex_replace(str, std::regex(":"), "");
        uint64_t result = stoull(hex, 0, 16);
        for (int i = 0; i < MAC_ADDR_LEN; i++) {
            mac_addr_buf[i] = (uint8_t) ((result & ((uint64_t) 0xFF << (i * 8))) >> (i * 8));
        }

        return true;
    }

    return false;
}
  • MAC Address에 해당하는 문자열을 ifstream으로 읽어온다
  • 문자열에서 regex 모듈을 활용해 콜론(:)을 없애준다
  • 문자열 전체를 64비트 정수형 값으로 변환시켜준다
  • bit-shift와 AND 연산을 통해 8비트 단위로 나누어 배열에 하나씩 대입해준다

※ 실사용시에는 인자로 입력받은 배열 포인터의 개수에 대한 예외처리를 추가해줘야한다

3. 테스트

main.cpp 함수에 메인 함수를 작성한 뒤 컴파일

#include <iostream>

int main(int argc, char *argv[]) {
    if (argv[1]) {
        std::cout << "Interface Name: " << argv[1] << "\n";
        uint8_t mac_addr[MAC_ADDR_LEN];
        if (get_mac_address(std::string(argv[1]), mac_addr)) {
            char temp[MAC_ADDR_LEN * 3 + 1] = {0,};
            snprintf(temp, MAC_ADDR_LEN * 3, "%02X:%02X:%02X:%02X:%02X:%02X", 
                mac_addr[5], mac_addr[4], mac_addr[3], mac_addr[2], mac_addr[1], mac_addr[0]);

            std::cout << "MAC Address: " << std::string(temp) << "\n";
        }
    }

    return 0;
}
$ g++ -g main.cpp -o main

실행 시 인자로 어댑터 이름을 입력해주면 된다

끝~!


[GitHub Repo]

https://github.com/YOGYUI/Sniffets/tree/main/linux_get_mac_address

 

GitHub - YOGYUI/Sniffets: 간단한 예제 코드들

간단한 예제 코드들. Contribute to YOGYUI/Sniffets development by creating an account on GitHub.

github.com

[참고]

https://stackoverflow.com/questions/1779715/how-to-get-mac-address-of-your-machine-using-a-c-program

 

반응형