Wednesday, September 17, 2014
내 IP 알아내기(리눅스)
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <net/if.h>
#include <arpa/inet.h>
int main()
{
// 이더넷 데이터 구조체
struct ifreq *ifr;
struct sockaddr_in *sin;
struct sockaddr *sa;
// 이더넷 설정 구조체
struct ifconf ifcfg;
int fd;
int n;
int numreqs = 30;
fd = socket(AF_INET, SOCK_DGRAM, 0);
// 이더넷 설정정보를 가지고오기 위해서
// 설정 구조체를 초기화하고
// ifreq데이터는 ifc_buf에 저장되며,
// 네트워크 장치가 여러개 있을 수 있으므로 크기를 충분히 잡아주어야 한다.
// 보통은 루프백주소와 하나의 이더넷카드, 2개의 장치를 가진다.
memset(&ifcfg, 0, sizeof(ifcfg));
ifcfg.ifc_buf = NULL;
ifcfg.ifc_len = sizeof(struct ifreq) * numreqs;
ifcfg.ifc_buf = malloc(ifcfg.ifc_len);
for(;;)
{
/* ifcfg.ifc_len = sizeof(struct ifreq) * numreqs;
ifcfg.ifc_buf = realloc(ifcfg.ifc_buf, ifcfg.ifc_len);*/
if (ioctl(fd, SIOCGIFCONF, (char *)&ifcfg) < 0)
{
perror("SIOCGIFCONF ");
exit;
}
break;
}
ifr = ifcfg.ifc_req;
for (n = 0; n < ifcfg.ifc_len; n+= sizeof(struct ifreq))
{
sin = (struct sockaddr_in *)&ifr->ifr_addr;
printf("IP %s\n", inet_ntoa(sin->sin_addr));
ifr++;
}
close(fd);
return 0;
}
Labels:
UnixC
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment