Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

설명

미완성

사용방법

코드

미완성 코드임
#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>

typedef struct _ifinfo
{
    struct sockaddr_in *sin;
	char ifname[40];
	int  fd;	
    struct ifreq *ifr;
	struct ifconf ifcfg;
	int  ifnum;
} IF; 

IF  *ifopen();
IF  *ifget(IF *);
int ifclose(IF *);

IF *ifopen()
{
    struct sockaddr_in *sin;
    int numreqs = 30;
	IF *LIF;

	LIF = (IF *)malloc(sizeof(&LIF));
	memset((void *)LIF, 0x00,sizeof(&LIF));

    LIF->fd = socket(AF_INET, SOCK_DGRAM, 0);

    memset(&ifcfg, 0, sizeof(ifcfg));
    ifcfg.ifc_buf = NULL;
    ifcfg.ifc_len = sizeof(struct ifreq) * numreqs;
    ifcfg.ifc_buf = malloc(ifcfg.ifc_len);
    ifcfg.ifc_len = sizeof(struct ifreq) * numreqs;
    ifcfg.ifc_buf = realloc(ifcfg.ifc_buf, ifcfg.ifc_len);
    if (ioctl(LIF->fd, SIOCGIFCONF, (char *)&ifcfg) < 0)
    {
        perror("SIOCGIFCONF ");
		return (IF *)NULL;
    }
    //printf("%d : %d \n", ifcfg.ifc_len, sizeof(struct ifreq));
    LIF->ifr = ifcfg.ifc_req;
	return LIF;
}

IF *ifget(IF *AIF)
{
	if (AIF->ifnum > 0)
	{
		AIF->ifr++;
	}
	if (AIF->ifnum < AIF->ifr.ifc_len)
	{
		AIF->ifnum += sizeof(struct ifreq);
		strncpy(AIF->ifname, AIF->ifr->ifr_name, 40);
		AIF->sin = (struct sockaddr_in *)&AIF->ifr->ifr_addr; 
		return AIF->ifr;
	}
	else
		return (IF *)NULL;
		
	/*
    for (n = 0; n < ifcfg.ifc_len; n+= sizeof(struct ifreq))
    {
        printf("%s\n", ifr->ifr_name);
        sin = (struct sockaddr_in *)&ifr->ifr_addr;
        printf("IP    %s\n", inet_ntoa(sin->sin_addr) );
		if ( (sin->sin_addr.s_addr) == INADDR_LOOPBACK)
		{
			printf("Loop Back\n");
		}
    
        ioctl(fd,  SIOCGIFBRDADDR, (char *)ifr);
        sin = (struct sockaddr_in *)&ifr->ifr_broadaddr;
        printf("BROD  %s\n", inet_ntoa(sin->sin_addr));

        ioctl(fd, SIOCGIFNETMASK, (char *)ifr);
        sin = (struct sockaddr_in *)&ifr->ifr_addr;
        printf("MASK  %s\n", inet_ntoa(sin->sin_addr));

        ioctl(fd, SIOCGIFMTU, (char *)ifr);
        printf("MTU   %d\n", ifr->ifr_mtu);

        ioctl(fd, SIOCGIFINDEX, (char *)ifr);
        printf("BAND  %d %d\n", ifr->ifr_ifindex, ifr->ifr_bandwidth);

        printf("\n");
        ifr++;
    }
	*/
}

int infget(IF *AIF)
{
	close(AIF->fd);
	free(AIF);
}

int main()
{
	IF *ifp;

	ifp = ifopen();
	if (ifp == NULL)
	{
		perror("error ");
	}
	while((ifp = ifget(ifp)) != NULL)
	{
		printf("GET GET\n");
	}
}

변경사항

2004/01/08

낙서

  • PointToPoint(ADSL) 에서는 자신의 IP와 반향되는 IP가 있는데 이 반향되는 IP를 얻으려면 SIOCGIFDSTADDR 을 사용하세요. 또한 IIf 가 DOWN되었을때 (IP가 없을때) 위의 방법으로는 해당 IP가 검출이 안될것으로 보입니다. 그래서 제가 고안한 방법은 /proc/net/route와 /proc/net/dev 를 종합 검색하는 부분이 필요할것으로 판단하고 있습니다. 혹시 다른 분들은 어떻게 생각하고 있을까요? [minzkn]
    • 음.. IIF가 다운되었을 경우는.. 생각하지 않아도 관계없을것 같다는 생각이.. ifconfig 같은 경우에도 IIF가 다운되어 있을 경우에는 정보를 출력하지 않으니.. SIOCGIFDSTADDR의 사용은 좋은 정보군요.. 한번 테스트 해봐야 겠네요. 아 확실히 하려면 /proc/net/route 등의 정보를 활용하는 것도 좋겠군요. [yundream]