|

楼主 |
发表于 2004-6-23 17:28:29
|
显示全部楼层
问题基本解决, 编译执行该程序后,用ifconfig命令来验证.
遗留问题:
执行该程序修改IP后, 内网可以ping通, 但不能出局域网(xinetd 重启也不行), 系统重启后就可以出访问外网了,这怎么解决?
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <sys/ioctl.h>
- #include <sys/socket.h>
- #include <net/if.h> /* struct ifreq 定义*/
- #include <arpa/inet.h> /* inet_addr () 函数申明 */
- void GetIp(char *ifname, char *ip)
- {
- int s;
-
- struct ifreq ifr;
- unsigned long ad;
- struct sockaddr_in *addr;
-
- s = socket(AF_INET, SOCK_DGRAM, 0);
-
- strcpy(ifr.ifr_name, ifname);
- ioctl(s, SIOCGIFADDR, &ifr);
- addr = (struct sockaddr_in*)&ifr.ifr_addr;
-
- close(s);
-
- ad = addr->sin_addr.s_addr;
-
- sprintf(ip, "%d.%d.%d.%d", (int) (ad & 0xFF), (int) ((ad >> 8) & 0xFF),
- (int) ((ad >> 16) & 0xFF), (int) ((ad >> 24) & 0xFF));
- }
- void SetIp(char *ifname, char *ip)
- {
- int s;
-
- struct ifreq ifr;
- struct sockaddr_in *addr;
-
- s = socket(AF_INET, SOCK_DGRAM, 0);
-
- strcpy(ifr.ifr_name, ifname);
- ioctl(s, SIOCGIFADDR, &ifr);
- addr = (struct sockaddr_in*)&ifr.ifr_addr;
- addr->sin_addr.s_addr = inet_addr(ip);
- bzero(&(addr->sin_zero), 8);
- ioctl(s, SIOCSIFADDR, &ifr);
- perror("Change IP");
-
- close(s);
- }
- void SetMask(char *ifname, char *mask)
- {
- int s;
-
- struct ifreq ifr;
- struct sockaddr_in *addr;
-
- s = socket(AF_INET, SOCK_DGRAM, 0);
-
- strcpy(ifr.ifr_name, ifname);
- ioctl(s, SIOCGIFADDR, &ifr);
- addr = (struct sockaddr_in*)&ifr.ifr_netmask;
- addr->sin_addr.s_addr = inet_addr(mask);
- bzero(&(addr->sin_zero), 8);
- ioctl(s, SIOCSIFNETMASK, &ifr);
- perror("Change IP MASK");
- close(s);
- }
- void SetBroadcast(char *ifname, char *brd)
- {
- int s;
-
- struct ifreq ifr;
- struct sockaddr_in *addr;
-
- s = socket(AF_INET, SOCK_DGRAM, 0);
-
- strcpy(ifr.ifr_name, ifname);
- ioctl(s, SIOCGIFADDR, &ifr);
- addr = (struct sockaddr_in*)&ifr.ifr_broadaddr;
- addr->sin_addr.s_addr = inet_addr(brd);
- bzero(&(addr->sin_zero), 8);
- ioctl(s, SIOCSIFBRDADDR, &ifr);
- perror("Change Boardcast");
- close(s);
- }
- int main()
- {
- char *ifname="eth0";
- char ip[40];
-
- GetIp(ifname, &ip[0]);
- perror(ip);
-
- SetIp(ifname, "192.168.1.34");
- SetMask(ifname, "255.255.255.0");
- /* SetBroadcast(ifname, "192.168.1.255");*/
- GetIp(ifname, &ip[0]);
- perror(ip);
-
- getchar();
- exit(0);
- }
复制代码 |
|