네트워크 상태 체크 질문입니다.

andro000의 이미지

네트워크에 관해 여쭤보려 합니다

질문) 윈도우즈 시작표시줄 오른쪽에 네트워크 송수신 상태가 나오는데 네트워크가 끊기면 X표시가 되면서 우리에게 끊겼다고 명시적으로 알려주는데.. 이것도 MS사에서 구현한 함수를 사용하여 기능을 만든것으로 생각되는데 혹시 어떤 함수를 사용해서 만들었을까요..? 혹은 어떤 기법을 사용해서 만들었을까요.... 끊겼다는 정보를 어떻게 알 수 있습니까.. 함수나 끊김을 알 수 있는 방법? 답변 부탁드립니다.

익명 사용자의 이미지

ifconfig 해보시면

eth0 Link encap:Ethernet HWaddr 00:02:9E:00:03:A9
inet addr:111.111.111.111 Bcast:192.168.33.255 Mask:255.255.255.0
UP BROADCAST NOTRAILERS RUNNING MULTICAST MTU:1500 Metric:1
RX packets:380160 errors:0 dropped:0 overruns:0 frame:0
TX packets:46156 errors:6 dropped:0 overruns:6 carrier:6
collisions:0 txqueuelen:100
RX bytes:536201499 (511.3 Mb) TX bytes:2944513 (2.8 Mb)
Interrupt:10 Base address:0x8000

여기서 RUNNING 상태가 선의 연결상태입니다.
그러면 이 플래그는 어떻게 얻어올까라는 질문을 던지시겠죠?

예전에 여기 한번 올렸던거 같은데 모르겠네요. 다시 올립니다.

/*
 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>

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(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 %02x:%02x:%02x:%02x:%02x:%02x",
		 s_ifrequest->ifr_hwaddr.sa_data[0] & 0xff,
		 s_ifrequest->ifr_hwaddr.sa_data[1] & 0xff,
		 s_ifrequest->ifr_hwaddr.sa_data[2] & 0xff,
		 s_ifrequest->ifr_hwaddr.sa_data[3] & 0xff,
		 s_ifrequest->ifr_hwaddr.sa_data[4] & 0xff,
		 s_ifrequest->ifr_hwaddr.sa_data[5] & 0xff
	        );
	 }
	}
	else strcpy(s_StringBuffer, "HWAddr <ERROR>");
	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 */ 
익명사용자의 이미지

MII를 사용하지 않고도 가능할까 하는 기대로 돌려봤습니다만,
위의 코드를 돌리면 케이블을 뽑아도 동일한 RUNNING 상태입니다.
위의 코드로는 케이블의 연결상태를 인식할 수 없습니다.
아래와 같은 결과가 케이블의 연결 여부와 상관없이 동일하게 나옵니다.
차라리 mii-tool의 소스를 받아서 필요한 부분만 사용하심이 좋을듯 합니다.

MZ_ifconfig v0.0.1b - Copyright(c)InfoEQ co.,LTD - Jan 9 2007 15:24:28
Code by JaeHyuk Cho -

eth0 Link encap:Unknown HWAddr 00:12:34:56:78:9a
inet addr 192.168.0.10 Broadcast 192.168.0.255 Netmask 255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.