C 언어 는 Liux 네트워크 카드 검 측 개선 판 을 실현 합 니 다.

 C 언어+셸 Liux 네트워크 카드 상태 검출 실현   화해시키다  C 언어 는 Liux 네트워크 카드 연결 검 측 을 실현 합 니 다.2 문의 방법 은 각각 결함 이 있다.예 를 들 어 일부 시스템 에서 ifconfig 를 실행 하려 면 루트 권한 이 필요 하 다.그렇지 않 으 면 ioctl(fd,SIOCGMIIPHY,&ifr)과 같은 조작 을 지원 하지 않 는 다.다음은C 언어 는 Liux 네트워크 카드 연결 검 측 을 실현 합 니 다.의 개선 판 실현C 언어+셸 Liux 네트워크 카드 상태 검출 실현과 같은 기능 을 제시 했다.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
 
 
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/if.h>
#include <linux/mii.h>
#include <linux/sockios.h>
#include <errno.h>
 
#include <ifaddrs.h>
#include <arpa/inet.h> 
 
#include <linux/ethtool.h>
 
int cshell_netlink_status(char *if_name)
{
 char  buffer[BUFSIZ];
 char  cmd[100];
 FILE  *read_fp;
 int    chars_read;
 int    ret =0;
 
 memset( buffer, 0, BUFSIZ );
 memset( cmd, 0, 100 );
 sprintf(cmd, "ifconfig -a | grep %s",if_name);
 read_fp = popen(cmd, "r");
 if ( read_fp != NULL )
 {
 chars_read = fread(buffer, sizeof(char), BUFSIZ-1, read_fp);
 pclose(read_fp);
 
 if (chars_read > 0)
 {
  ret = 1;
 }
 else
 {
  fprintf(stderr, "DEVICE_NONE\r
"); return 0; } } if(ret == 1) { memset( buffer, 0, BUFSIZ ); memset( cmd, 0, 100 ); sprintf(cmd, "ifconfig |grep %s",if_name); read_fp = popen(cmd, "r"); if ( read_fp != NULL ) { chars_read = fread(buffer, sizeof(char), BUFSIZ-1, read_fp); pclose(read_fp); if (chars_read > 0) { ret = 2; } else { fprintf(stderr, "DEVICE_DOWN\r
"); return 1; } } } if(ret == 2) { memset( buffer, 0, BUFSIZ ); memset( cmd, 0, 100 ); sprintf(cmd, "ifconfig %s | grep RUNNING | awk '{print $3}'",if_name); read_fp = popen(cmd, "r"); if ( read_fp != NULL ) { chars_read = fread(buffer, sizeof(char), BUFSIZ-1, read_fp); pclose(read_fp); if (chars_read > 0) { fprintf(stderr, "DEVICE_LINKED\r
"); return 3; } else { fprintf(stderr, "DEVICE_UNPLUGGED\r
"); return 2; } } } return -1; } int c_netlink_status(const char *if_name ) { int fd = -1; struct ifreq ifr; struct ifconf ifc; struct ifreq ifrs_buf[100]; int if_number =0; int i; if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { fprintf(stderr, "%s: socket error [%d] %s\r
",if_name, errno, strerror(errno)); close(fd); return -1; } ifc.ifc_len = sizeof(ifrs_buf); ifc.ifc_buf = (caddr_t)ifrs_buf; if (ioctl(fd, SIOCGIFCONF, (char *)&ifc) <0) { fprintf(stderr, "%s: ioctl SIOCGIFCONF error [%d] %s\r
",if_name, errno, strerror(errno)); close(fd); return -1; } if_number = ifc.ifc_len / sizeof(struct ifreq); for(i=0; i< if_number; i++) { if(strcmp(if_name,ifrs_buf[i].ifr_name ) == 0) { break; } } if(i >= if_number) { close(fd); fprintf(stderr, "DEVICE_NONE\r
"); return 0; } bzero(&ifr, sizeof(ifr)); strncpy(ifr.ifr_name, if_name, IFNAMSIZ-1); ifr.ifr_name[IFNAMSIZ-1] = 0; if (ioctl(fd, SIOCGIFFLAGS, (char *)&ifr) <0) { fprintf(stderr, "%s: ioctl SIOCGIFFLAGS error [%d] %s\r
",if_name, errno, strerror(errno)); close(fd); return -1; } #if 1 if(!(ifr.ifr_flags & IFF_UP)) { close(fd); fprintf(stderr, "DEVICE_DOWN\r
"); return 1; } if(!(ifr.ifr_flags & IFF_RUNNING)) { close(fd); fprintf(stderr, "DEVICE_UNPLUGGED\r
"); return 2 ; } fprintf(stderr, "DEVICE_LINKED\r
"); return 3; #else { struct ethtool_value edata; if(!(ifr.ifr_flags & IFF_UP) || !(ifr.ifr_flags & IFF_RUNNING)) { close(fd); fprintf(stderr, "%s: DOWN\r
",if_name); return 1; } edata.cmd = ETHTOOL_GLINK; edata.data = 0; ifr.ifr_data = (char *) &edata; if(ioctl( fd, SIOCETHTOOL, &ifr ) < 0) { fprintf(stderr, "%s: ioctl SIOCETHTOOL error [%d] %s\r
",if_name, errno, strerror(errno)); close(fd); return -1; } if(edata.data == 0) { fprintf(stderr, "DEVICE_UNPLUGGED\r
"); return 2; } else { fprintf(stderr, "DEVICE_LINKED\r
"); return 3; } } #endif } int main(int argc, char* argv[]) { int i=0; if(argc != 2) { fprintf(stderr, "usage: %s <ethname>\r
", argv[0]); return -1; } i = cshell_netlink_status(argv[1]); printf( "cshell_netlink_status if_status = %d
", i ); i = c_netlink_status(argv[1]); printf( "c_netlink_status if_status = %d
", i ); return 0; }
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기