본문 바로가기

Developement/C/C++

리눅스내 현재 접속 ip 알기.


사진은 본문과 관련 없는 구형 AnyStreaming HDMI 부분...


 리눅스나, 임베디드 리눅스 내에서 현재 연결된 장치에 따라 ip 를 알고 싶을 때가 있다, 이럴때 아래 코드를 사용할 수 있다.


#include <sys⁄types.h>
#include <sys⁄stat.h>
#include <sys⁄socket.h>
#include <sys⁄ioctl.h>
#include <fcntl.h>
#include <errno.h>

#include <unistd.h>
#include <net⁄if.h>
#include <netinet⁄in.h>
#include <arpa⁄inet.h>
#include <signal.h>

#include <cstdio>
#include <cstdlib>
#include <cstring>


bool getmyip( const char* devname, struct in_addr* addr )
{
    struct ifreq    ifr;
    int             fdSockTest = -1;

    fdSockTest = socket( AF_INET, SOCK_DGRAM, IPPROTO_IP );
    if ( fdSockTest >= 0 )
    {
        strcpy( ifr.ifr_name, devname ); ⁄⁄⁄ or "wlan0"

        if ( ioctl( fdSockTest, SIOCGIFADDR, &ifr ) == 0 )
        {
            struct sockaddr_in* ipaddr = (struct sockaddr_in*)&ifr.ifr_addr;
            memcpy( addr, &ipaddr->sin_addr, sizeof( struct in_addr ) );

            close( fdSockTest );
            return true;
        }

        close( fdSockTest );
    }

    return false;
}


함수 사용에 devname 은 "eth0" 이나, "wlan0" 과 같은 네트웍에 인지된 장치 이름이며, 보통 ifconfig 으로 보이는 장치명과 같은걸 쓰면 된다.

덤으로, in_addr 로 얻어진 주소를 inet_ntoa() 를 통해 문자열로 바꾼 다음 아래 함수를 쓰면 unsigned char 배열 4개로 분리 할 수 있다.


bool convert_ipstr_to_iparray( const char* is, unsigned char* ia )
{
    if ( ( is == NULL ) || ( ia == NULL ) )
    {
        return false;
    }

    char* srcs = strdup( is );
    char* stok = strtok( srcs, "." );
    int   ncnt = 0;

    while( stok != NULL )
    {
        unsigned in = atoi( stok );
        ia[ncnt] = in;
        ncnt++;
        if ( ncnt > 3 )
            break;
        stok = strtok( NULL, "." );
    }

    free( srcs );

    return true;
}