본 글에서는 리눅스 시스템의 네트워크 인터페이스를 C 언어로 작성된 프로그램 상에서 활성화하는 방법을 설명한다. 반대로, 비활성화하는 방법은 다음 글에 설명되어 있다. 2020/02/15 - [프로그래밍/리눅스 프로그래밍] - 리눅스 네트워크 프로그래밍 - 네트워크 인터페이스 비활성화하기 리눅스 시스템에서 네트워크 인터페이스를 활성화하기 위해 보통 ifconfig up 명령을 사용한다. 아래 내용은 ifconfig eth0 up 명령을 이용하여 eth0 라는 이름을 갖는 네트워크 인터페이스를 활성화 하는 내용이다. root@10a25d934dda:/workspace# ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP L..
본 글에서는 리눅스 시스템의 네트워크 인터페이스에 할당되어 있는 MAC 주소를 확인하는 프로그램을 작성하는 방법에 대해 설명한다. 프로그램 상에서 네트워크 인터페이스의 MAC 주소를 확인하는 기본 절차는 다음과 같다. socket() 함수로 네트워크 인터페이스에 대한 소켓 파일 디스크립터를 연다. struct ifreq 구조체 변수에 확인할 네트워크 인터페이스의 이름(예: eth0)을 저장한다. ioctl() 함수의 SIOCGIFHWADDR 명령을 통해 네트워크 인터페이스의 MAC 주소를 읽는다. 다음은 C 언어로 작성된 예제 프로그램의 소스 코드이다. #include #include #include #include #include #include #include #include /// MAC 주소 길이..
본 글에서는 리눅스 시스템의 네트워크 인터페이스에 MAC 주소를 설정하는 프로그램을 작성하는 방법에 대해 설명한다. 프로그램 상에서 네트워크 인터페이스의 MAC 주소를 설정하는 기본 절차는 다음과 같다. socket() 함수로 네트워크 인터페이스에 대한 소켓 파일 디스크립터를 연다. struct ifreq 구조체 변수에 설정할 네트워크 인터페이스의 이름(예: eth0), 주소 등을 저장한다. ioctl() 함수의 SIOCSIFHWADDR 명령을 통해 네트워크 인터페이스를 설정한다. 다음은 C 언어로 작성된 예제 프로그램의 소스 코드이다. #include #include #include #include #include #include #include #include /// MAC 주소 길이 #define ..
본 글에서는 문자열 형태로 표현된 네트워크 인터페이스 MAC 주소를 6바이트 길이의 바이트열로 변환하는 방법에 대해 설명한다. 이더넷 네트워크 인터페이스의 MAC 주소는 6바이트의 길이를 가지며, 보통 다음과 같이 표현된다. 리눅스 계열 운영체제 : 00:01:02:03:04:05 윈도우즈 운영체제 : 00-01-02-03-04-05 MAC 주소가 위와 같은 형태의 문자열로 표현되어 있을 때(예: "00:01:02:03:04:05"), 이 문자열을 6바이트 길이의 바이트열로 변환하는 간단한 함수를 다음과 같이 구현할 수 있다. #include #include #include /// MAC 주소 길이 #define MAC_ALEN 6 /// MAC 주소 문자열 길이 #define MAC_ADDR_STR_L..
본 글에서는 IPv6 주소 바이트열을 문자열로 변환해 주는 inet_ntop() 함수에 대해 소개한다. 다음은 IPv6 주소 바이트열을 문자열로 변환하여 출력하는 예제 프로그램이다. IPv6_ALEN : IPv6 주소는 128비트, 즉 16바이트 길이를 가진다. IPv6_ADDR_STR_MAX_LEN : 최대 길이의 문자열로 표현된다고 가정하면, IPv6 주소는 16바이트 길이를 가지므로, 4비트 당 한 글자씩 총 32글자가 필요하다. 또한 4글자 마다 사이에 콜론이 들어갈 수 있으므로 최대 7개의 콜론이 들어갈 수 있다. 따라서 IPv6 주소 문자열의 최대 길이는 (16 * 2) + 7 = 39 바이트가 된다. 문자열을 저장하기 위한 배열은 마지막 종료 문자까지 고려하여 39 + 1 = 40 바이트의 ..
본 글에서는 네트워크 인터페이스의 MAC 주소 바이트열을 출력하는 구문을 간소화할 수 있는 매크로에 대해 소개한다. 보통 MAC 주소를 출력하고자 하는 경우 printf 문을 다음과 같은 형태로 작성할 수 있는데, 이 때 6 바이트 길이를 갖는 MAC 주소의 각 바이트를 출력하기 위해 작성 구문이 길어지게 된다. 출력 구문을 처음부터 끝까지 직접 작성하거나 복사-붙여넣기 후 수정할 수도 있는데, 둘 모두 편안하지는 않다. printf("MAC address - %02X:%02X:%02X:%02X:%02X:%02X\n", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); 다음과 같이 매크로를 정의하여 출력 구문을 간소화 시킬 수가 있다. #include #i..
본 글에서는 배열에 담긴 바이트열 데이터를 16진수 형식으로 출력(Hex dump)하는 함수를 소개한다. 본 함수는 다양한 형태의 바이트열 데이터(예: 네트워크 패킷 데이터)에 담긴 내부 정보를 로그로 출력하여 디버깅하는 용도로 많이 활용된다. 본 함수를 실행하면, 다음 그림처럼 리눅스에서 xxd 명령을 통해 출력되는 형태와 유사하게 출력된다. 좌측에는 오프셋 값, 중앙에는 Hex dump 값, 우측에는 ASCII 코드 값이 출력된다. 다음은 Hex dump 출력 함수 전문이다. #include #include /** * 버퍼에 담긴 데이터에 대한 Hex dump 를 출력한다. 우측에 아스키 값도 함께 출력한다. * * @param[in] data 출력할 데이터가 담긴 배열 * @param[in] len..
본 글에서는 리눅스 시스템의 각 네트워크 인터페이스에 IPv6 주소를 할당(추가)하거나 제거하는 프로그램을 작성하는 방법에 대해 설명한다. 본 글에서 다루는 IPv6 주소 할당 관련 기능은 다음과 같으며, 각 기능 별 예제 프로그램은 C 언어로 작성되었다. 네트워크 인터페이스에 IPv6 주소 할당(추가)하기 MAC 주소로부터 EUI-64 형식 Interface ID 생성하기 링크-로컬 IPv6 주소 할당하기 글로벌 IPv6 주소 할당하기 (Stateless Address Autoconfiguration) 네트워크 인터페이스에 할당된 IPv6 주소 제거하기 네트워크 인터페이스에 할당된 IPv6 주소(들)을 확인하는 방법은 아래 글에 설명되어 있다. 2020/02/08 - [프로그래밍/리눅스 프로그래밍] -..
본 글에서는 리눅스 시스템의 각 네트워크 인터페이스에 할당되어 있는 IPv6 주소(들)을 확인하는 프로그램을 작성하는 법에 대해 설명한다. 본 글에서 다루는 IPv6 주소 확인 관련 기능은 다음과 같으며, 각 기능 별 예제 프로그램은 C 언어로 작성되었다. 네트워크 인터페이스에 할당된 모든 IPv6 주소 확인하기 네트워크 인터페이스에 할당된 링크-로컬 IPv6 주소 확인하기 네트워크 인터페이스에 할당된 사이트-로컬 IPv6 주소 확인하기 네트워크 인터페이스에 할당된 글로벌 IPv6 주소 확인하기 네트워크 인터페이스에 할당된 루프백 IPv6 주소 확인하기 네트워크 인터페이스에 IPv6 주소를 할당(추기)하거나 제거하는 방법은 아래 글에 설명되어 있다. 2020/02/08 - [프로그래밍/리눅스 프로그래밍]..
본 글에서는 16진수 문자열을 바이트열로 변환하는 함수를 소개한다. 예를 들어, "FE303321" 과 같이 16진수를 표현하는 8바이트 길이의 문자열을 array[4] = { 0xFE, 0x30, 0x33, 0x21 } 과 같은 4바이트 배열로 변환하는 함수이다. #include #include #include /** * 16진수 문자열을 바이트열로 변환한다. * @param[in] hex_str 16진수 문자열 (예: fe80000000000000024954fffe454b01) * @param[out] array 변환된 바이트열이 저장될 버퍼 * @return 변환된 바이트열의 길이 */ size_t ConvertHexStrToArray(const char *hex_str, uint8_t *array..
C# 에서 C/C++ 라이브러리(dll) API 함수 호출하기 본 글에서는 C/C++ 로 구현된 라이브러리가 제공하는 API 함수를 C# 어플리케이션에서 호출하는 방법을 설명한다. C/C++ 로 구현된 라이브러리의 경우, 일반적으로 헤더파일(*.h) 상에 라이브러리가 제공하는 API 함수의 원형과 각종 파라미터(매크로, 변수형, 구조체 등)를 정의하여 제공한다. 해당 라이브러리를 사용하는 프로그램이 동일하게 C/C++ 로 구현될 경우, 이러한 헤더 파일을 이용하여 라이브러리가 제공하는 API 함수를 호출할 수 있다. 하지만 C# 에서는 헤더파일을 사용할 수 없기 때문에, C/C++ 라이브러리가 제공하는 API 함수와 파라미터들을 C# 구현에 맞는 형태로 Import 및 재선언하여 사용해야 한다. 본 글에..
소프트웨어를 개발할 때, 소프트웨어의 동작이나 상태, 오류 등을 확인하기 위한 로그 출력 기능이 필요할 수 있다. 예를 들어, 가장 많이 사용되는 로그 출력은 printf() 함수를 이용한 화면 출력이며, 필요에 따라 파일에 저장하는 방식도 사용된다. 또한 동작 중 발생하는 이벤트의 종류나 우선순위(중요도)에 따라 로그의 레벨을 다르게 설정하고, 원하는 우선순위 이상의 로그만을 출력하는 기능도 필요할 수 있다. 본 글에서는 설정된 로그레벨 이상의 우선순위를 갖는 로그를 출력하는 함수를 구현하는 방법을 소개한다. 또한 필요에 따라 로그 출력문에 부가적인 정보를 추가하되, 매크로를 활용함으로써 함수 호출 형식 자체는 복잡하지 않게 구현하는 방법을 소개한다. 본 글에서 소개하는 로그 출력 함수는 다음과 같은 ..