사진은 본문과 관련 없는 구형 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;
}