일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Home Assistant
- 힐스테이트 광교산
- 애플
- 국내주식
- matter
- raspberry pi
- 배당
- Espressif
- Bestin
- 공모주
- 오블완
- cluster
- homebridge
- 현대통신
- MQTT
- Apple
- 코스피
- 해외주식
- 티스토리챌린지
- 나스닥
- ConnectedHomeIP
- 홈네트워크
- 미국주식
- 파이썬
- Python
- RS-485
- esp32
- 매터
- SK텔레콤
- 월패드
- Today
- Total
YOGYUI
C++::Linux에서 네트워크 어댑터 MAC Address 가져오기 본문
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
[참고]
https://stackoverflow.com/questions/1779715/how-to-get-mac-address-of-your-machine-using-a-c-program
'Software > C, C++' 카테고리의 다른 글
C++::Linux에서 프로그램 중복 실행 방지 (0) | 2022.08.23 |
---|---|
C++::Linux에서 특정 프로세스의 ID값(PID) 읽어오기 (pidof 명령어) (0) | 2022.08.22 |
C++::디렉터리 존재 여부 확인하기 (g++) (0) | 2022.07.25 |
C++::chrono - 현재 날짜/시간 가져오기 (밀리초 포함) (0) | 2022.07.24 |
MFC::프로그램으로 PC 전원 끄기 (Windows OS) (0) | 2022.02.23 |