³×Æ®¿öÅ© Á¤º¸ ¼öÁý
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : article>network_information



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

Contents

1 ¼Ò°³
2 Linux
2.1 Snmp Ç׸ñ
2.1.1 Interface º° I/O Á¤º¸
2.1.2 Àü¿ª ÆÐŶÁ¤º¸(IP/ICMP/TCP/UDP)
2.2 ÀÎÅÍÆäÀ̽º ÀϹÝÁ¤º¸ ¾ò±â
2.2.1 ioctl(2)¸¦ ÀÌ¿ëÇÑ ÀÎÅÍÆäÀ̽º Á¤º¸ ¼öÁý
2.2.1.1 ÀÎÅÍÆäÀ̽º »óÅÂ
2.2.2 º¸°­ ÄÚµå
2.3 Interfaceº° ÀÔÃâ·Â Á¤º¸
3 Solaris
4 °ü·Ã ¾²·¹µå


1 ¼Ò°³

Unix ¿î¿µÃ¼Á¦¿¡¼­ÀÇ ³×Æ®¿öÅ© Á¤º¸¼öÁý¿¡ ´ëÇÑ ³»¿ëÀ» ´Ù·é´Ù. Unix ¿î¿µÃ¼Á¦ ¸¶´Ù ¼öÁýÇØ¾ßÇÏ´Â ¹æ¹ýÀÌ Â÷À̰¡ ÀÖÀ½À¸·Î ¿î¿µÃ¼Á¦º°·Î ¼³¸íÀ» Çϵµ·Ï ÇϰڴÙ.

¿©±â¿¡¼­ ¼öÁýÇÒ ³×Æ®¿öÅ© Á¤º¸´Â ¾Æ·¡ÀÇ ¸ñ·Ïµé¿¡ Æ÷ÇÔµÈ ³»¿ëµéÀÌ´Ù.
  1. Interface ÀϹÝÁ¤º¸
    1. Interface ÁÖ¼Ò(Ipaddress, Network, NetMask)
    2. MAC(12) Address
    3. MTU(12) Size
    4. Interface À̸§(eh0...)
    5. Interface »óÅÂ(Link Up, Down)
  2. Interface ÆÐŶÁ¤º¸
    1. In/Out bps/pps
    2. In/Out UniCast pps
    3. In/Out Drop/Error pps
  3. ÀÏ¹Ý ³×Æ®¿öÅ© Á¤º¸ (SNMP ¼öÁýÇ׸ñµé)
    1. ipForwarding
    2. ipDefaultTTL
    3. ipInHdrErrors
    4. ipInDiscards
    5. ipInAddrErrors
    6. ipInReceives
    7. ipOutRequests
    8. icmpInmsgs
    9. icmpInErrors
    10. icmpOutMsgs
    11. icmpOutErrors
    12. icmpInEchos
    13. icmpOutEchos
    14. tcpInSegs
    15. tcpOutSegs
    16. tcpInErrs
    17. tcpMaxConn
    18. udpInDatagrams
    19. udpNoports
    20. udpInerrors
    21. udpOutDatagrams

ÀÏ¹Ý³×Æ®¿öÅ© Á¤º¸ÀÇ °æ¿ì Àú¿Ü¿¡µµ ¼ö½Ê°³ÀÇ ¼öÁýÇÒ ¼ö ÀÖ´Â Ç׸ñµéÀÌ ´õ ÀÖÁö¸¸, ¿©±â¿¡¼­´Â ±×Áß Áß¿äÇÏ´Ù°í »ý°¢µÇ´Â ÀϺθ¸ ¼öÁýÇϵµ·Ï ÇϰڴÙ. ÀÏ¹Ý ³×Æ®¿öÅ© Á¤º¸µéÀº SNMP MIBII ÀÇ Ç׸ñµéÁß¿¡¼­ ¼±ÅÃÇß´Ù. °¢ Ç׸ñµéÀº MIB¿¡ ¸ÊÇÎ ½Ãų ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¿©±â¿¡ ´ëÇÑ Á¤¸®´Â ÃßÈÄ¿¡ Çϵµ·Ï ÇÑ´Ù.

2 Linux

¸®´ª½º ¿î¿µÃ¼Á¦ÀÇ °æ¿ì ´ëºÎºÐÀÇ Áß¿ä Á¤º¸µéÀ» /proc ÆÄÀÏ ½Ã½ºÅÛÀ» ÅëÇØ¼­ ¾ò¾î¿Ã ¼ö ÀÖ´Ù.
  1. ÀÎÅÍÆäÀ̽º ÆÐŶ Á¤º¸ : /proc/net/dev
  2. ÀÏ¹Ý ³×Æ®¿öÅ© Á¤º¸ (SNMP ¼öÁýÇ׸ñµé) : /proc/net/snmp
´Ù¸¸ ÀÎÅÍÆäÀ̽ºÀÇ ÀϹÝÁ¤º¸´Â /proc¿¡¼­ Áö¿øÇÏÁö ¾Ê´Â´Ù. À̵é Á¤º¸´Â ioctl()À» ÀÌ¿ëÇØ¾ß ÇÑ´Ù.

2.1 Snmp Ç׸ñ

MIBII¸¦ ±âÁØÀ¸·Î ÇÑ´Ù.

2.1.1 Interface º° I/O Á¤º¸

Ç׸ñ ¼³¸í ´ÜÀ§
ifInOctets ÀÔ·Â Byte Count
ifInUcastPkts ÀÔ·Â UniCast Count
ifInDiscards ÀÔ·Â Discard Count
ifInErrors ÀÔ·Â Error Count
ifOutOctets Ãâ·Â Byte Count
ifOutUcastPkts Ãâ·Â UniCast Count
OutDiscards Ãâ·Â Discard Count
ifOutErrors Ãâ·Â Error Count

2.1.2 Àü¿ª ÆÐŶÁ¤º¸(IP/ICMP/TCP/UDP)


2.2 ÀÎÅÍÆäÀ̽º ÀϹÝÁ¤º¸ ¾ò±â

ioctl(2)ÇÔ¼ö´Â ÀÔÃâ·Â ÀåÄ¡¸¦ Á¦¾îÇϰí, Àåºñ¸¦ ¾ò±â À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëÇÏ´Â ÇÔ¼ö´Ù. ioctlÀ» ÅëÇØ¼­ ÇØ´ç ÀåÄ¡¿¡ ´ëÇÑ Á¦¾î¿Í Á¤º¸¸¦ ¾ò±â À§Çؼ­´Â ÇØ´ç »çÇ׿¡ ´ëÇØ¼­ ¾î¶°ÇÑ flags¸¦ »ç¿ëÇÏ´ÂÁö¸¦ ¾Ë°í ÀÖ¾î¾ß ÇÑ´Ù.

À̵é flags´Â /usr/include/bits/ioctls.h¿¡ Á¤ÀǵǾî ÀÖ´Ù. ÀÌÁß ³×Æ®¿öÅ© ÀåÄ¡µéÀº SIOCGIFÀÇ Á¢µÎ»ç¸¦ °¡Áö°í Á¤ÀǵǾî ÀÖ´Ù. ´ÙÀ½Àº ±×Áß ÀϺκÐÀÌ´Ù.
#define SIOCGIFNAME     0x8910          /* get iface name               */ 
#define SIOCSIFLINK     0x8911          /* set iface channel            */ 
#define SIOCGIFCONF     0x8912          /* get iface list               */ 
#define SIOCGIFFLAGS    0x8913          /* get flags                    */ 
#define SIOCSIFFLAGS    0x8914          /* set flags                    */ 
#define SIOCGIFADDR     0x8915          /* get PA address               */ 
#define SIOCSIFADDR     0x8916          /* set PA address               */ 
#define SIOCGIFDSTADDR  0x8917          /* get remote PA address        */ 
#define SIOCSIFDSTADDR  0x8918          /* set remote PA address        */ 
#define SIOCGIFBRDADDR  0x8919          /* get broadcast PA address     */ 
#define SIOCSIFBRDADDR  0x891a          /* set broadcast PA address     */ 
#define SIOCGIFNETMASK  0x891b          /* get network PA mask          */ 
#define SIOCSIFNETMASK  0x891c          /* set network PA mask          */ 
#define SIOCGIFMETRIC   0x891d          /* get metric                   */ 
#define SIOCSIFMETRIC   0x891e          /* set metric                   */ 
#define SIOCGIFMEM      0x891f          /* get memory address (BSD)     */ 
#define SIOCSIFMEM      0x8920          /* set memory address (BSD)     */ 
#define SIOCGIFMTU      0x8921          /* get MTU size                 */ 
#define SIOCSIFMTU      0x8922          /* set MTU size                 */ 
#define SIOCSIFNAME     0x8923          /* set interface name           */ 
#define SIOCSIFHWADDR   0x8924          /* set hardware address         */ 
 
À̸§À¸·Î ¾îµð¿¡ »ç¿ëµÇ´Â Ç÷¹±×µéÀÎÁö ÃæºÐÈ÷ ¾Ë¾Æº¼ ¼ö ÀÖÀ¸¸®¶ó »ý°¢µÈ´Ù.

2.2.1 ioctl(2)¸¦ ÀÌ¿ëÇÑ ÀÎÅÍÆäÀ̽º Á¤º¸ ¼öÁý

´ÙÀ½Àº ioctlÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ eth0ÀÇ ÀÎÅÍÆäÀ̽º Á¤º¸¸¦ ¼öÁýÇÏ´Â ¹æ¹ýÀÌ´Ù.
int fd; 
struct ifreq ifrq; 
struct sockaddr_in *sin; 
 
fd = socket(AF_INET, SOCK_DGRAM, 0); 
 
// eth0¿¡ ´ëÇÑ MAC ÁÖ¼Ò¸¦ ¾ò´Â´Ù. 
strcpy(ifrq.ifr_name, "eth0"); 
if (ioctl(fd,SIOCGIFHWADDR, &ifrq) < 0)   
{ 
    // ¿¡·¯Ã³¸® 
} 
printf("Mac Address : %s", ifrq.ifr_hwaddr.sa_data); 
// MACÁÖ¼Ò¸¦ ":"·Î ±¸ºÐµÇ´Â Ç¥ÁØÆ÷¸äÀ¸·Î ¸¸µé±â À§Çؼ­´Â  
// º°µµÀÇ Äڵ尡 ÇÊ¿äÇÏ´Ù. 
 
// eth0¿¡ ´ëÇÑ IP address ¸¦ ¾ò´Â´Ù. 
if (ioctl(fd, SIOCGIFADDR, &ifrq) < 0)  
{ 
    // ¿¡·¯Ã³¸® 
} 
sin = (sockaddr_in *)&ifrq.ifr_addr; 
printf("%s\n", inet_ntoa(sin->sin_addr)); 
 

Äڵ带 ¸íÈ®È÷ ÀÌÇØÇÏ°í »ç¿ëÇϱâ À§Çؼ­´Â ifreq ±¸Á¶Ã¼¿¡ ´ëÇØ¼­ Á¤È®ÇÑ Á¤º¸¸¦ °¡Áö°í ÀÖÀ» Çʿ䰡 ÀÖ´Ù. ifreq ±¸Á¶Ã¼´Â /usr/include/net/if.h¿¡ Á¤ÀǵǾî ÀÖÀ¸´Ï Âü°íÇϱ⠹ٶõ´Ù.

2.2.1.1 ÀÎÅÍÆäÀ̽º »óÅÂ
ÀÎÅÍÆäÀ̽º´Â ¿©·¯°¡Áö »óŰ¡ ÀÖÀ» ¼ö ÀÖ´Ù. ÇöÀç up»óŰ¡ ¾Æ´Ò ¼öµµ ÀÖ°í, loopback »óÅÂÀÇ ÀåÄ¡ÀÏ ¼öµµ ÀÖ´Ù. ÀÌ·¯ÇÑ Á¤º¸´Â SIOCGIFFLAGS¸¦ ÀÌ¿ëÇØ¼­ flag°ªÀ» ºÐ¼®ÇÔÀ¸·Î½á ¾ò¾î¿Ã ¼ö ÀÖ´Ù. flags¿¡ °üÇÑ Á¤º¸´Â /usr/include/net/if.h¿¡ Á¤ÀǵǾî ÀÖÀ¸´Ï Âü°íÇϱ⠹ٶõ´Ù.
#ifdef __USE_MISC 
/* Standard interface flags. */ 
enum 
  { 
    IFF_UP = 0x1,               /* Interface is up.  */ 
# define IFF_UP IFF_UP 
    IFF_BROADCAST = 0x2,        /* Broadcast address valid.  */ 
# define IFF_BROADCAST  IFF_BROADCAST 
    IFF_DEBUG = 0x4,            /* Turn on debugging.  */ 
# define IFF_DEBUG      IFF_DEBUG 
    IFF_LOOPBACK = 0x8,         /* Is a loopback net.  */ 
# define IFF_LOOPBACK   IFF_LOOPBACK 
    IFF_POINTOPOINT = 0x10,     /* Interface is point-to-point link.  */ 
# define IFF_POINTOPOINT IFF_POINTOPOINT 
    IFF_NOTRAILERS = 0x20,      /* Avoid use of trailers.  */ 
...... 
 

´ÙÀ½Àº ioctl(2)¸¦ ÀÌ¿ëÇØ¼­ ÀÎÅÍÆäÀ̽º Á¤º¸¸¦ ¾ò¾î¿À´Â ¿¹Á¦´Ù.
#include <sys/socket.h> 
#include <unistd.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <stdio.h> 
#include <net/if.h> 
#include <sys/ioctl.h> 
#include <sys/stat.h> 
 
#include <arpa/inet.h> 
 
int main(int argc, char **argv) 
{ 
  int fd; 
  int i; 
 
  struct ifreq ifrq; 
  struct sockaddr_in *sin; 
 
  if (argc != 2) 
  { 
    printf("usage : ./ifinfo [ifname]\n"); 
    return 1; 
  } 
  fd = socket (AF_INET, SOCK_DGRAM, 0); 
  if(fd < 0) 
  { 
    perror("Socket open error"); 
    return 1; 
  } 
  strcpy(ifrq.ifr_name, argv[1]); 
  if(ioctl(fd, SIOCGIFHWADDR, &ifrq) < 0) 
  { 
    perror("Mac Error"); 
  } 
  // MAC ÁÖ¼Ò´Â Àû´çÈ÷ º¯È¯½Ã۵µ·Ï ÇÏÀÚ. 
  for (i = 0; i < 6; i++) 
  { 
    printf("%x\n",ifrq.ifr_addr.sa_data[i]); 
  } 
  if(ioctl(fd, SIOCGIFADDR, &ifrq) < 0) 
  { 
    perror("IPADDR Error"); 
  } 
  sin = (struct sockaddr_in *)&ifrq.ifr_addr; 
  printf("IPADDR : %s\n", inet_ntoa(sin->sin_addr)); 
 
  if(ioctl(fd, SIOCGIFMTU, &ifrq) < 0) 
  { 
    perror("IPADDR Error"); 
  } 
  printf("MTU : %d\n", ifrq.ifr_mtu); 
 
  // GET NETMASK 
  if(ioctl(fd, SIOCGIFNETMASK, &ifrq) < 0) 
  { 
    perror("NETMASK Error"); 
  } 
  sin = (struct sockaddr_in *)&ifrq.ifr_addr; 
  printf("NETMASK : %s\n", inet_ntoa(sin->sin_addr)); 
  if(ioctl(fd, SIOCGIFFLAGS, &ifrq) < 0) 
  { 
    perror("SIOCGIFFLAGS"); 
  } 
  if(!(ifrq.ifr_flags & IFF_UP)) 
  { 
    printf("IF STATUS UP\n"); 
  } 
  else 
  { 
    printf("IF STATUS DOWN\n"); 
  } 
  close(fd); 
} 
 
±×·±µ¥ À§ÀÇ ÄÚµå´Â ¾à°£ÀÇ ¹®Á¦°¡ ÀÖ´Ù. ±×°ÍÀº ÀÎÅÍÆäÀ̽º À̸§À» ¹Ýµå½Ã ¾Ë°í ÀÖ¾î¾ß¸¸ Á¤º¸¸¦ ¾ò¾î¿Ã ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù. Á»´õ ¹ü¿ë¼º ÀÖ´Â Äڵ带 À§Çؼ­´Â ÇöÀç »ç¿ëÁßÀÎ ÀÎÅÍÆäÀ̽ºÀÇ À̸§À» ÀÚµ¿À¸·Î ¾ò¾î¿Í¼­ °Å±â¿¡ ´ëÇÑ Á¤º¸¸¦ ±¸Á¶Ã¼ Çü½ÄÀ¸·Î ³Ñ°ÜÁÖµµ·Ï ÀÛ¼ºµÇ¾î¾ß ÇÒ°ÍÀÌ´Ù.

´ÙÇàÈ÷µµ ioctl(2)¿¡´Â ÀÛµ¿ÁßÀÎ ÀÎÅÍÆäÀ̽ºÀÇ ¸ñ·ÏÀ» À§ÇÑ SIOCGIFCONF¸¦ Á¦°øÇÑ´Ù. ÀÌ flag¸¦ ÀÌ¿ëÇØ¼­ ÀÎÅÍÆäÀ̽ºÀÇ À̸§À» Æ÷ÇÔÇÑ ¸ñ·ÏÀ» ¾ò¾î¿Ã ¼ö ÀÖ´Ù. SIOCGIFCONFÀÇ ÀÀ¿ë¿¹´Â pcapÆäÀÌÁö¸¦ Âü°íÇϱ⠹ٶõ´Ù.

ÀÌ»ó SIOCGIFCONF¸¦ ÀÌ¿ëÇϸé ÀÎÅÍÆäÀ̽ºÀÇ ¸ñ·ÏÀ» ¾ò¾î¿Ã ¼ö Àִµ¥, ÀÛµ¿ÁßÀÎ ÀÎÅÍÆäÀ̽ºÀÇ ¸ñ·Ï¸¸À» ¾ò¾î¿Â´Ù´Â ¹®Á¦Á¡À» °¡Áø´Ù. ÇöÀç ½Ã½ºÅÛ¿¡ ¸î°³ÀÇ ÀÎÅÍÆäÀ̽º°¡ ÀÖ´ÂÁö, ¾î¶² Á¾·ùÀÎÁö(ÀÎÅÍÆäÀ̽º À̸§À» º¸¸é ±â°¡ºñÆ® ÀÌ´õ³ÝÀÎÁö ¾Æ´ÑÁöµî¿¡ ´ëÇÑ Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Ù), MAC µîÀÇ Á¤º¸¸¦ ¾ò±â À§Çؼ­´Â ÀÛµ¿ÁßÀÌÁö ¾Ê´Â ÀÎÅÍÆäÀ̽º¶ó ÇÏ´õ¶óµµ Á¤º¸¸¦ ¾ò¾î¿Ã Çʿ䰡 ÀÖ´Ù.

ÀÌ ¹®Á¦´Â /proc/net/dev¸¦ ºÐ¼®ÇÔÀ¸·Î½á ÇØ°á°¡´ÉÇÏ´Ù. devÆÄÀÏ¿¡´Â ÀÎÅÍÆäÀ̽ºÀÇ À̸§»Ó¸¸ ¾Æ´Ï¶ó ÀÔÃâ·ÂµÇ´Â ÆÐŶ°ú µ¥ÀÌÅÍÀÇ countÁ¤º¸±îÁö Á¦°øÇØÁØ´Ù. devÆÄÀÏ¿¡ ´ëÇÑ ³»¿ëÀº µÚ¿¡¼­ µû·Î ´Ù·çµµ·Ï ÇϰڴÙ.

MACÁÖ¼Ò º¯È¯Àº char2hex¸¦ Âü°íÇϱ⠹ٶõ´Ù.

2.2.2 º¸°­ ÄÚµå

Á»´õ º¸°­ÇÑ Äڵ带 ¾Æ·¡¿¡ Àû¾îº¾´Ï´Ù. - minzkn
/*  
 Copyright (c) 2002 Information Equipment co.,LTD.  
 All Right Reserved.  
 
 Code by JaeHyuk Cho <minzkn@infoeq.co.kr>  
 
 - Simple is best  
*/  
 
#if !defined(DEF_ifconfig_c)  
#define DEF_ifconfig_c "ifconfig.c"  
 
#include <stdio.h>  
#include <unistd.h>  
#include <stdlib.h>  
#include <string.h>  
#include <sys/types.h>  
#include <sys/socket.h>  
#include <sys/ioctl.h>  
#include <netinet/in.h>  
#include <net/if.h>  
#include <netinet/if_ether.h>  
#include <arpa/inet.h>  
#include <netdb.h>  
#include <netinet/ether.h>  
 
int main(int s_Argc, char **s_Argv);  
 
int main(int s_Argc, char **s_Argv)  
{  
 int s_SocketHandle;     
 int s_RequestCount = 10;  
 struct ifconf s_ifconfig;  
 struct ifreq *s_ifrequest;  
 struct sockaddr_in *s_SockAddr_In;  
   
 char s_StringBuffer[1 << 10];  
 char *s_MyTitle;  
 char *s_MyDevice;  
 char *s_MyIP, *s_MyBroadcastIP, *s_MyNetmaskIP;  
 char *s_MyHWAddr;  
 char *s_MyFlagString;  
 int  s_MyFlags, s_MyMTU, s_MyMetric;  
 fprintf(stdout, "MZ_ifconfig v0.0.1b - Copyright(c)InfoEQ co.,LTD - %s %s\n", __DATE__, __TIME__);  
 fprintf(stdout, "Code by JaeHyuk Cho - <minzkn@infoeq.co.kr>\n\n");  
 s_SocketHandle = socket(AF_INET, SOCK_DGRAM, 0);  
 if(s_SocketHandle >= 0)  
 {  
  memset((void *)&s_ifconfig, 0, sizeof(struct ifconf));  
  do  
  {  
   if(s_ifconfig.ifc_buf)free(s_ifconfig.ifc_buf);  
   s_ifconfig.ifc_len = sizeof(struct ifreq) * s_RequestCount;  
   s_ifconfig.ifc_buf = malloc(s_ifconfig.ifc_len);  
   if(s_ifconfig.ifc_buf)  
   {  
    if(ioctl(s_SocketHandle, SIOCGIFCONF, &s_ifconfig) == 0)  
    {  
     if(s_ifconfig.ifc_len < (sizeof(struct ifreq) * s_RequestCount))  
     {  
      s_ifrequest = s_ifconfig.ifc_req;  
      if(s_ifrequest)  
      {  
       for(s_RequestCount = 0;s_RequestCount < s_ifconfig.ifc_len;s_RequestCount += sizeof(struct ifreq), s_ifrequest++)  
       {  
        /* ------------------------------------------------------------------------ */            
   s_MyDevice = strdup(s_ifrequest->ifr_name);  
     
   /* ioctl(s_SocketHandle, SIOCGIFADDR, s_ifrequest); */  
   s_SockAddr_In       = (struct sockaddr_in *)(&s_ifrequest->ifr_addr);  
        s_MyIP              = strdup(inet_ntoa(s_SockAddr_In->sin_addr));     
   ioctl(s_SocketHandle, SIOCGIFBRDADDR, s_ifrequest);         
   s_SockAddr_In       = (struct sockaddr_in *)&s_ifrequest->ifr_broadaddr;  
        s_MyBroadcastIP     = strdup(inet_ntoa(s_SockAddr_In->sin_addr));     
   ioctl(s_SocketHandle, SIOCGIFNETMASK, s_ifrequest);         
   s_SockAddr_In       = (struct sockaddr_in *)&s_ifrequest->ifr_netmask;  
        s_MyNetmaskIP       = strdup(inet_ntoa(s_SockAddr_In->sin_addr));     
#if 0     
   if(ioctl(s_SocketHandle, SIOCGIFHWADDR, s_ifrequest) == 0)  
   {  
    unsigned char s_NullHWAddr[] = {0, 0, 0, 0, 0, 0};  
         if(memcmp(&s_ifrequest->ifr_hwaddr.sa_data[0], &s_NullHWAddr[0], sizeof(s_NullHWAddr)) == 0)strcpy(s_StringBuffer, "");  
    else sprintf(s_StringBuffer, "HWAddr %s", ether_ntoa((struct ether_addr *)s_ifrequest->ifr_hwaddr.sa_data));  
   }  
   else strcpy(s_StringBuffer, "HWAddr <ERROR>");  
#else  
   if(ioctl(s_SocketHandle, SIOCGIFHWADDR, s_ifrequest) == 0)  
   {  
    sprintf(s_StringBuffer, "HWAddr %s", ether_ntoa((struct ether_addr *)s_ifrequest->ifr_hwaddr.sa_data));  
   }  
   else strcpy(s_StringBuffer, "HWAddr <ERROR>");  
#endif  
   s_MyHWAddr = strdup(s_StringBuffer);  
     
   if(ioctl(s_SocketHandle, SIOCGIFFLAGS, s_ifrequest) == 0)s_MyFlags = s_ifrequest->ifr_flags;  
   else s_MyFlags = 0;  
          strcpy(s_StringBuffer, "");  
   if(s_MyFlags == 0)strcpy(s_StringBuffer, "[NO FLAGS]");  
   else  
   {  
    if(s_MyFlags & IFF_UP          )strcat(s_StringBuffer, "UP ");     
    if(s_MyFlags & IFF_BROADCAST   )strcat(s_StringBuffer, "BROADCAST ");     
    if(s_MyFlags & IFF_DEBUG       )strcat(s_StringBuffer, "DEBUG ");     
    if(s_MyFlags & IFF_LOOPBACK    )strcat(s_StringBuffer, "LOOPBACK ");     
    if(s_MyFlags & IFF_POINTOPOINT )strcat(s_StringBuffer, "POINTOPOINT ");     
    if(s_MyFlags & IFF_NOTRAILERS  )strcat(s_StringBuffer, "NOTRAILERS ");     
    if(s_MyFlags & IFF_RUNNING     )strcat(s_StringBuffer, "RUNNING ");     
    if(s_MyFlags & IFF_NOARP       )strcat(s_StringBuffer, "NOARP ");     
    if(s_MyFlags & IFF_PROMISC     )strcat(s_StringBuffer, "PROMISC ");     
    if(s_MyFlags & IFF_ALLMULTI    )strcat(s_StringBuffer, "ALLMULTI ");     
    if(s_MyFlags & IFF_SLAVE       )strcat(s_StringBuffer, "SLAVE ");     
    if(s_MyFlags & IFF_MASTER      )strcat(s_StringBuffer, "MASTER ");     
    if(s_MyFlags & IFF_MULTICAST   )strcat(s_StringBuffer, "MULTICAST ");     
   }  
   s_MyFlagString = strdup(s_StringBuffer);  
 
        s_MyTitle = strdup("Unknown"); /* Not support */  
     
   if(ioctl(s_SocketHandle, SIOCGIFMTU, s_ifrequest) == 0)s_MyMTU = s_ifrequest->ifr_mtu;  
   else s_MyMTU = 0;  
     
   if(ioctl(s_SocketHandle, SIOCGIFMETRIC, s_ifrequest) == 0)s_MyMetric = s_ifrequest->ifr_metric;  
   else s_MyMetric = 0;  
         
   /* Print. */  
   fprintf(stdout,  
      "%-8s Link encap:%s  %s\n"  
      "%-8s inet addr %-15s  Broadcast %-15s  Netmask %-15s\n"  
      "%-8s %s MTU:%d Metric:%d\n"  
      "\n",  
           s_MyDevice, s_MyTitle, s_MyHWAddr,  
      "", s_MyIP, s_MyBroadcastIP, s_MyNetmaskIP,  
      "", s_MyFlagString, s_MyMTU, s_MyMetric ? s_MyMetric : 1  
          );  
     
   /* Free. */  
   if(s_MyTitle      )free(s_MyTitle);  
   if(s_MyDevice     )free(s_MyDevice);  
   if(s_MyIP         )free(s_MyIP);  
   if(s_MyBroadcastIP)free(s_MyBroadcastIP);  
   if(s_MyNetmaskIP  )free(s_MyNetmaskIP);  
   if(s_MyHWAddr     )free(s_MyHWAddr);  
   if(s_MyFlagString )free(s_MyFlagString);  
        /* ------------------------------------------------------------------------ */            
       }  
      }  
      break;  
     }  
     else s_RequestCount += 10;  
    }  
    else break;  
   }  
   else break;  
  }while(1);   
  if(s_ifconfig.ifc_buf)free(s_ifconfig.ifc_buf);  
  close(s_SocketHandle);      
 }  
 else fprintf(stderr, "Can not open socket !!!\n");  
 return(0);  
}  
 
#endif  
 
/* End of source */ 
 

2.3 Interfaceº° ÀÔÃâ·Â Á¤º¸

Linux ¿î¿µÃ¼Á¦ÀÇ °æ¿ì /proc/net/dev¿¡ °¢ ÀÎÅÍÆäÀ̽ºº° ÀÔÃâ·Â °á°ú¸¦ ±â·ÏÇϰí ÀÖ´Ù.
Inter-|   Receive                                                |  Transmit 
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed 
    lo:409140906 1037900   0    0    0     0          0         0 409140906  1037900  0    0    0     0       0          0 
  eth0:96555668  1756131   0    0    0     0          0         0  1919184     16396  0    0    0     0       0          0 
  eth1:264456417 12795632  0    0  130     0          0         0 795974945 13424861  0    0    0 632340      0          0 
 
À§¿Í °°Àº Çü½ÄÀ¸·Î µÇ¾î ÀÖÀ¸´Ï ´Ü¼øÈ÷ ÆÄ½ÌÇØ¼­ º¸¿©Áֱ⸸ ÇϸéµÈ´Ù.

´Ü À§ ÆÄÀÏ¿¡´Â ONµÇ¾î ÀÖÁö ¾ÊÀº ºñȰ¼ºÈ­ µÈ Interface±îÁö¸¦ ÀüºÎº¸¿©Áֱ⠶§¹®¿¡, Á¤º¸¸¦ °¡Á®¿À±â Àü¿¡ ÇØ´ç ÀÎÅÍÆäÀ̽º°¡ Ȱ¼ºÈ­ µÇ¾î ÀÖ´Â ÀÎÅÍÆäÀ̽ºÀÎÁö¸¦ È®ÀÎÇÒ Çʿ䰡 ÀÖ´Ù. ÀÌ È®ÀÎÀº ioctl(2)¿¡ SIOCGIFCONFÀ» ÀÌ¿ëÇÏ¸é µÈ´Ù.

´ÙÀ½Àº °£´ÜÇÑ ¿¹Á¦ ÇÁ·Î±×·¥ÀÌ´Ù. ÀϹÝÀûÀ¸·Î Interface ÀÔÃâ·Â Á¤º¸ÀÇ ´ÜÀ§´Â bpsȤÀº ppsÀÌ´Ù. ±×·¯¹Ç·Î bytesectionÀÇ °ªÀº *8 À» ÇØ¼­ bit·Î º¯È¯½ÃÄÑÁÖ´Â ÀÛ¾÷ÀÌ ÇÊ¿äÇÒ °ÍÀÌ´Ù. ´õ¿í Á¦´ë·Î ÀÛµ¿ÇÏ°Ô ÇÏ·Á¸é ÀÌÀüÀÇ °ª°ú ÇöÀçÀÇ °ªÀ» ºñ±³Çؼ­ bps·Î ȯ»êµÈ °ªÀ» º¸¿©Áà¾ß °ÚÁö¸¸ ÀÌ ¿¹Á¦ Äڵ忡¼­´Â »ý·«Çϵµ·Ï ÇϰڴÙ.

¾Æ·¡ÀÇ ÄÚµå´Â ÃÖ¼ÒÇÑÀÇ ÀÛµ¿¸¸À» º¸¿©ÁØ´Ù. ½Ã°£ÀÌ µÈ´Ù¸é ±×·²µíÇÑ ÄÚµå·Î º¯°æÇغ¸±â ¹Ù¶õ´Ù.
#include <iostream> 
#include <map> 
#include <unistd.h> 
#include <stdio.h> 
#include <vector> 
#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> 
 
using namespace std; 
 
#define proc_net_dev_format "%s %s %s %s %s %s %s %s %s %s %s %s %s %s" 
 
vector<string> GetActiveInterface(); 
 
typedef struct _Inter_IO 
{ 
  char byte[16]; 
  char packet[16]; 
  char error[16]; 
  char drop[16]; 
  char fifo[16]; 
  char frame[16]; 
  char compressed[16]; 
  char multicast[16]; 
} Inter_IO; 
 
typedef struct _interface_IO 
{ 
  char devname[16]; 
  Inter_IO Rcv_IO; 
  Inter_IO Snd_IO; 
} interface_IO; 
 
// ÀÎÅÍÆäÀ̽º ÀÔÃâ·Â Á¤º¸°¡ µé¾î°¥ ±¸Á¶Ã¼ 
typedef struct _devInfo 
{ 
  char devname[12]; 
  int inbps; 
  int outbps; 
  int inpps; 
  int outpps; 
  int inucast; 
  int outucast; 
  int inerrs; 
  int indrops; 
  int outerrs; 
  int outdrops; 
  int status; 
} devInfo; 
 
vector<devInfo> getInterIO(); 
int main() 
{ 
  vector<devInfo> ldevInfo; 
  cout << "=======================" << endl; 
  ldevInfo = getInterIO(); 
  for (int i = 0; i < ldevInfo.size(); i++) 
  { 
    cout << ldevInfo[i].devname << " : " << ldevInfo[i].inbps 
          << " : " << ldevInfo[i].status << endl; 
  } 
} 
 
// proc/net/dev ÆÄÀÏÀ» ºÐ¼®Çؼ­ ÀÎÅÍÆäÀ̽º ÀÔÃâ·Â Á¤º¸¸¦ ¾ò¾î¿Â´Ù. 
vector<devInfo> getInterIO() 
{ 
  FILE *fp; 
  char line[1024]; 
  unsigned int i; 
  char name[20]; 
  char devname[12]; 
  char *lp; 
  char *rp; 
  devInfo ldevInfo; 
  vector<devInfo> rtvInfo; 
  vector<string> ActiveInf = GetActiveInterface(); 
 
  interface_IO IfIO; 
  if ((fp = fopen("/proc/net/dev", "r")) == NULL) 
  { 
    perror("fopen error"); 
  } 
 
  int linenum = -2; 
  while(fgets(line, 1023, fp) != NULL) 
  { 
    if (linenum < 0) 
    { 
      linenum++; 
      continue; 
    } 
    memset((void *)&IfIO, 0x00, sizeof(IfIO)); 
    sscanf(line, 
          proc_net_dev_format, 
          name, 
          IfIO.Rcv_IO.packet, 
          IfIO.Rcv_IO.error, 
          IfIO.Rcv_IO.drop, 
          IfIO.Rcv_IO.fifo, 
          IfIO.Rcv_IO.frame, 
          IfIO.Rcv_IO.compressed, 
          IfIO.Rcv_IO.multicast, 
 
          // Snd 
          IfIO.Snd_IO.byte, 
          IfIO.Snd_IO.packet, 
          IfIO.Snd_IO.error, 
          IfIO.Snd_IO.drop, 
          IfIO.Snd_IO.fifo, 
          IfIO.Snd_IO.frame, 
          IfIO.Snd_IO.compressed); 
      lp = strstr(name, ":"); 
      sprintf(IfIO.Rcv_IO.byte, "%s", lp+1); 
      strncpy(IfIO.devname,name,lp-name); 
 
      sprintf(ldevInfo.devname, "%s", IfIO.devname); 
      ldevInfo.inbps = atoi(IfIO.Rcv_IO.byte); 
      ldevInfo.outbps = atoi(IfIO.Snd_IO.byte); 
      ldevInfo.inucast = atoi(IfIO.Rcv_IO.packet); 
      ldevInfo.outucast = atoi(IfIO.Snd_IO.packet); 
      ldevInfo.inerrs = atoi(IfIO.Rcv_IO.error); 
      ldevInfo.outerrs = atoi(IfIO.Snd_IO.error); 
      ldevInfo.indrops = atoi(IfIO.Rcv_IO.drop); 
      ldevInfo.outdrops = atoi(IfIO.Snd_IO.drop); 
      ldevInfo.status = 0; 
      for (i = 0; i < ActiveInf.size(); i++) 
      { 
        if (ActiveInf[i] == IfIO.devname) 
        { 
          ldevInfo.status = 1; 
        } 
      } 
      rtvInfo.push_back(ldevInfo); 
  } 
  fclose(fp); 
  return rtvInfo; 
} 
 
// Ȱ¼ºÈ­µÈ ÀÎÅÍÆäÀ̽º ¸ñ·ÏÀ» ¾ò¾î¿Â´Ù. 
vector<string> GetActiveInterface() 
{ 
  struct ifreq *ifr; 
  struct sockaddr_in *sin; 
  struct ifconf ifcfg; 
  int fd; 
  int n; 
  int numreqs = 36; 
  vector<string> intername; 
  fd = socket (AF_INET, SOCK_DGRAM, 0); 
  memset(&ifcfg, 0x00, sizeof(ifcfg)); 
  ifcfg.ifc_len = sizeof(struct ifreq) *numreqs; 
  (void *)ifcfg.ifc_buf = malloc(ifcfg.ifc_len); 
 
  ifcfg.ifc_len = sizeof(struct ifreq) * numreqs; 
  (void *)ifcfg.ifc_buf = realloc(ifcfg.ifc_buf, ifcfg.ifc_len); 
  if(ioctl(fd, SIOCGIFCONF, (char *)&ifcfg) < 0) 
  { 
    perror("ioctl error"); 
  } 
 
  ifr = ifcfg.ifc_req; 
  for (n = 0; n < ifcfg.ifc_len; n+=sizeof(struct ifreq)) 
  { 
    intername.push_back(ifr->ifr_name); 
    ifr++; 
  } 
  return intername; 
} 
 

3 Solaris

°ÅÀÇ ´ëºÎºÐÀÇ ³×Æ®¿öÅ©Á¤º¸¸¦ /proc ÆÄÀϽýºÅÛÀ» ÅëÇÏ¿© ¾òÀ» ¼ö ÀÖ´Â Linux¿Í ´Þ¸® Solaris´Â kstat kernel library¸¦ ÅëÇØ ¾ò¾î¾ß ÇÑ´Ù. kstat¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸´Â kstatÀ§Å°¸¦ Âü°íÇϱ⠹ٶõ´Ù.


4 °ü·Ã ¾²·¹µå


EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.