LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1005|回复: 6

请教应用层如何修改IP等网络参数?

[复制链接]
发表于 2004-6-22 14:33:30 | 显示全部楼层 |阅读模式
根据一些文章介绍,应用程序通过ioctl可以更改和查询网络配置, 但不知道如何做,下面的测试代码不能通过,这样做有什么问题?

  1. #include <stdio.h>
  2. #include <sys/ioctl.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. int main()
  6. {
  7.         int         sock_fd, ioctl_fd;
  8.         struct         ifreq        s;  
  9.                
  10.         sock_fd= socket(AF_INET, SOCK_STREAM, 0);
  11.         if( fd == -1)
  12.         {       
  13.                 perror("socket failed");
  14.         }
  15.        
  16.          ioctl_fd = ioctl(sock_fd, SIOCDEVPRIVATE, s);
  17.         perror("");
  18.        
  19.         return (0);
  20. }

  21. 编译错误:
  22. main.c:11: error:storage size of 's' is'not known
复制代码
发表于 2004-6-22 16:00:28 | 显示全部楼层
struct         ifreq       
缺少结构的定义,要找到头文件
 楼主| 发表于 2004-6-22 16:42:38 | 显示全部楼层
这个结构是不是在应用层不能用?  那应如何实现呢,我想设置IP
发表于 2004-6-22 17:01:08 | 显示全部楼层
at /usr/include/net/if.h

设置ip在网络层。只要把程序写出来就行了。能力有限。。。(还没学到)
 楼主| 发表于 2004-6-22 17:24:19 | 显示全部楼层
没包含头文件
#include <net/if.h>
 楼主| 发表于 2004-6-23 17:28:29 | 显示全部楼层
问题基本解决, 编译执行该程序后,用ifconfig命令来验证.

遗留问题:
执行该程序修改IP后, 内网可以ping通, 但不能出局域网(xinetd 重启也不行),  系统重启后就可以出访问外网了,这怎么解决?


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>               

  5. #include <sys/ioctl.h>
  6. #include <sys/socket.h>
  7. #include <net/if.h>              /* struct ifreq 定义*/
  8. #include <arpa/inet.h>         /* inet_addr () 函数申明 */

  9. void GetIp(char *ifname, char *ip)
  10. {
  11.         int           s;
  12.        
  13.         struct ifreq  ifr;
  14.         unsigned long ad;
  15.         struct sockaddr_in *addr;
  16.        
  17.         s = socket(AF_INET, SOCK_DGRAM, 0);
  18.        
  19.         strcpy(ifr.ifr_name, ifname);  
  20.         ioctl(s, SIOCGIFADDR, &ifr);
  21.         addr = (struct sockaddr_in*)&ifr.ifr_addr;
  22.        
  23.         close(s);
  24.        
  25.         ad = addr->sin_addr.s_addr;
  26.           
  27.         sprintf(ip, "%d.%d.%d.%d", (int) (ad & 0xFF), (int) ((ad >> 8) & 0xFF),
  28.                 (int) ((ad >> 16) & 0xFF), (int) ((ad >> 24) & 0xFF));
  29. }

  30. void SetIp(char *ifname, char *ip)
  31. {
  32.         int  s;
  33.        
  34.         struct ifreq  ifr;
  35.         struct sockaddr_in *addr;
  36.        
  37.         s = socket(AF_INET, SOCK_DGRAM, 0);
  38.        
  39.         strcpy(ifr.ifr_name, ifname);  
  40.         ioctl(s, SIOCGIFADDR, &ifr);

  41.         addr = (struct sockaddr_in*)&ifr.ifr_addr;
  42.         addr->sin_addr.s_addr = inet_addr(ip);
  43.         bzero(&(addr->sin_zero), 8);
  44.         ioctl(s, SIOCSIFADDR, &ifr);
  45.         perror("Change IP");
  46.                
  47.         close(s);
  48. }

  49. void SetMask(char *ifname, char *mask)
  50. {
  51.         int  s;
  52.        
  53.         struct ifreq  ifr;
  54.         struct sockaddr_in *addr;
  55.        
  56.         s = socket(AF_INET, SOCK_DGRAM, 0);
  57.        
  58.         strcpy(ifr.ifr_name, ifname);  
  59.         ioctl(s, SIOCGIFADDR, &ifr);

  60.         addr = (struct sockaddr_in*)&ifr.ifr_netmask;
  61.         addr->sin_addr.s_addr = inet_addr(mask);
  62.         bzero(&(addr->sin_zero), 8);
  63.         ioctl(s, SIOCSIFNETMASK, &ifr);
  64.         perror("Change IP MASK");
  65.         close(s);
  66. }

  67. void SetBroadcast(char *ifname, char *brd)
  68. {
  69.         int  s;
  70.        
  71.         struct ifreq  ifr;
  72.         struct sockaddr_in *addr;
  73.        
  74.         s = socket(AF_INET, SOCK_DGRAM, 0);
  75.        
  76.         strcpy(ifr.ifr_name, ifname);  
  77.         ioctl(s, SIOCGIFADDR, &ifr);

  78.         addr = (struct sockaddr_in*)&ifr.ifr_broadaddr;
  79.         addr->sin_addr.s_addr = inet_addr(brd);
  80.         bzero(&(addr->sin_zero), 8);
  81.         ioctl(s, SIOCSIFBRDADDR, &ifr);
  82.         perror("Change Boardcast");
  83.         close(s);
  84. }

  85. int main()
  86. {
  87.         char *ifname="eth0";
  88.         char ip[40];
  89.                
  90.         GetIp(ifname, &ip[0]);       
  91.         perror(ip);
  92.        
  93.         SetIp(ifname, "192.168.1.34");
  94.         SetMask(ifname, "255.255.255.0");
  95. /*        SetBroadcast(ifname, "192.168.1.255");*/

  96.         GetIp(ifname, &ip[0]);       
  97.         perror(ip);
  98.        
  99.         getchar();
  100.         exit(0);
  101. }

复制代码
发表于 2004-6-24 16:45:49 | 显示全部楼层
从ip地址到以太网硬件地址的解析工作是由ARP协议完成的,局域网上的主机不一定知道某个硬件地址对应的ip已经被修改了,网关的arp缓存中可能保留的是原来的信息。用arp广播一下看看。
http://www.chinaunix.net/jh/5/99220.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表