一个类似ifconfig功能的程序代码--C语言(ZZ)

一个类似ifconfig功能的程序代码--C语言(ZZ)
2010年07月30日
  
001 #include
  002 #include
  003 #include
  004 #include
  005 #include
  006 #include
  007 #include
  008 #include
  009
  010 int info_list(int all);
  011
  012 int get_interface_info(char *interface_name);
  013 int set_interface(char *interface_name);
  014 int get_ipaddr(char *interface_name);
  015 int get_mac(char *interface_name);
  016 int get_netmask(char *interface_name);
  017 int get_broadcast(char *interface_name);
  018 int set_ipaddr(char *interface_name, char *ip);
  019 int set_mac(char *interface_name, char *mac);
  020 int set_netmask(char *interface_name, char *netmask);
  021 int set_broadcast(char *interface_name, char *broadcast);
  022
  023 int interface_up(char *interface_name);
  024 int interface_down(char *interface_name);
  025
  026 int usage();
  027
  028 int main(int argc, char *argv[])
  029 {
  030 if (argc == 1)
  031 {
  032 info_list(0);
  033 return 0;
  034 }
  035
  036 if (argc == 2)
  037 {
  038 if (strcmp(argv[1], "all") == 0)
  039 {
  040 info_list(1);
  041 return 0;
  042 }
  043
  044 get_interface_info(argv[1]);
  045
  046 return 0;
  047 }
  048
  049 if (argc == 3)
  050 {
  051 if (strcmp(argv[2], "set") == 0)
  052 {
  053 set_interface(argv[1]);
  054 return 0;
  055 }
  056 if (strcmp(argv[2], "up") == 0)
  057 {
  058 interface_up(argv[1]);
  059 return 0;
  060 }
  061 if (strcmp(argv[2], "down") == 0)
  062 {
  063 interface_down(argv[1]);
  064 return 0;
  065 }
  066
  067 usage();
  068
  069 return 0;
  070 }
  071
  072 usage();
  073
  074 return 0;
  075 }
  076
  077 int info_list(int all)
  078 {
  079 int len;
  080 char *ifreq_pointer;
  081 len = 10 * sizeof(struct ifreq);
  082 ifreq_pointer = (char *) malloc(len);
  083
  084 struct ifconf get_info;
  085 get_info.ifc_len = len;
  086 get_info.ifc_ifcu.ifcu_buf = ifreq_pointer;
  087
  088 int sockfd;
  089 sockfd = socket(PF_INET, SOCK_STREAM, 0);
  090 ioctl(sockfd, SIOCGIFCONF, &get_info);
  091
  092 int count;
  093 count = get_info.ifc_len / sizeof(struct ifreq);
  094
  095 struct sockaddr_in *return_sockaddr;
  096
  097 struct ifreq *result = (struct ifreq *) ifreq_pointer;
  098 int i = 0;
  099 if (all == 1)
  100 {
  101 for (i; i ifr_name);
  104 get_ipaddr(result->ifr_name);
  105 get_mac(result->ifr_name);
  106 get_netmask(result->ifr_name);
  107 get_broadcast(result->ifr_name);
  108 }
  109 } else
  110 {
  111 struct ifreq tmp;
  112 int s;
  113 if ((s = socket(PF_INET, SOCK_STREAM, 0)) ifr_name);
  122 if (ioctl(s, SIOCGIFFLAGS, &tmp) socket(PF_INET, SOCK_STREAM, 0)) sin_addr));
  162
  163 return 0;
  164 }
  165
  166 int get_mac(char *interface_name)
  167 {
  168 if (strcmp(interface_name, "lo") == 0)
  169 {
  170 return 0;
  171 }
  172
  173 int s;
  174
  175 if ((s = socket(PF_INET, SOCK_STREAM, 0)) socket(PF_INET, SOCK_STREAM, 0)) sin_addr));
  222
  223 return 0;
  224 }
  225
  226 int get_broadcast(char *interface_name)
  227 {
  228 int s;
  229
  230 if ((s = socket(PF_INET, SOCK_STREAM, 0)) sin_addr));
  249
  250 return 0;
  251
  252 }
  253
  254 int get_interface_info(char *interface_name)
  255 {
  256 get_ipaddr(interface_name);
  257 get_mac(interface_name);
  258 get_netmask(interface_name);
  259 get_broadcast(interface_name);
  260
  261 return 0;
  262 }
  263
  264 int set_interface(char *interface_name)
  265 {
  266 char ip[18];
  267 char mac_addr[20];
  268 char netmask[18];
  269 char broadcast[18];
  270
  271 printf("Change ");
  272 get_ipaddr(interface_name);
  273 printf("To: ");
  274 fgets(ip, 17, stdin);
  275 if (strcmp(ip, "\n") == 0)
  276 goto set_mac;
  277 set_ipaddr(interface_name, ip);
  278
  279 set_mac:
  280 printf("Change ");
  281 get_mac(interface_name);
  282 printf("To: ");
  283 fgets(mac_addr, 19, stdin);
  284 if (strcmp(mac_addr, "\n") == 0)
  285 goto set_netmask;
  286 set_mac(interface_name, mac_addr);
  287
  288 set_netmask:
  289 printf("Change ");
  290 get_netmask(interface_name);
  291 printf("To: ");
  292 fgets(netmask, 17, stdin);
  293 if (strcmp(netmask, "\n") == 0)
  294 goto set_broadcast;
  295 set_netmask(interface_name, netmask);
  296
  297 set_broadcast:
  298 printf("Change ");
  299 get_broadcast(interface_name);
  300 printf("To: ");
  301 fgets(broadcast, 17, stdin);
  302 if (strcmp(broadcast, "\n") == 0)
  303 return 0;
  304 set_broadcast(interface_name, broadcast);
  305
  306 return 0;
  307 }
  308
  309 int interface_up(char *interface_name)
  310 {
  311 int s;
  312
  313 if ((s = socket(PF_INET, SOCK_STREAM, 0)) socket(PF_INET, SOCK_STREAM, 0)) socket(PF_INET, SOCK_STREAM, 0)) socket(PF_INET, SOCK_STREAM, 0)) 47)
  442 tmp = mac_addr - 48;
  443 if (mac_addr 64)
  444 tmp = mac_addr - 55;
  445 if (mac_addr 96)
  446 tmp = mac_addr - 87;
  447 tmp = tmp 47)
  449 tmp |= (mac_addr[i + 1] - 48);
  450 if (mac_addr[i + 1] 64)
  451 tmp |= (mac_addr[i + 1] - 55);
  452 if (mac_addr[i + 1] 96)
  453 tmp |= (mac_addr[i + 1] - 87);
  454 memcpy(&ifr.ifr_ifru.ifru_hwaddr.sa_data[j++], &tmp, 1);
  455 }
  456
  457 if (ioctl(s, SIOCSIFHWADDR, &ifr) socket(PF_INET, SOCK_STREAM, 0)) socket(PF_INET, SOCK_STREAM, 0)) < 0)
  504 {
  505 perror("Socket");
  506 return -1;
  507 }
  508
  509 struct ifreq ifr;
  510 strcpy(ifr.ifr_name, interface_name);
  511
  512 struct sockaddr_in broadcast_addr;
  513 bzero(&broadcast_addr, sizeof(struct sockaddr_in));
  514 broadcast_addr.sin_family = PF_INET;
  515 inet_aton(broadcast, &broadcast_addr.sin_addr);
  516
  517 memcpy(&ifr.ifr_ifru.ifru_broadaddr, &broadcast_addr,
  518 sizeof(struct sockaddr_in));
  519
  520 if (ioctl(s, SIOCSIFBRDADDR, &ifr) < 0)
  521 {
  522 perror("ioctl");
  523 return -1;
  524 }
  525
  526 return 0;
  527 }
  528
  529 int usage(void)
  530 {
  531 printf("Usage: myifconfig [all]|[interface [set|up|down]]\n");
  532 return 0;
  533 }
  把每行开头的空格换成0
  :%s/^\ /0/
  去掉每行开头的行号(数字)
  :%s/^[0-9]*//
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值