📄 ip.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wait.h>
//接收表单数据的格式如下(最多75个字节)
//ip=xxx.xxx.xxx.xxx&mask=xxx.xxx.xxx.xxx&gateway=xxx.xxx.xxx.xxx&Submit=Save
//其中xxx为1--3位数字
//如果没有输入数据,则获取的数据格式如下(共30个字节)
//ip=&mask=&gateway=&Submit=Save
#define MAXLEN 75
#define uchar unsigned char
char InputBuffer[] = "ip=192.168.1.210&mask=255.255.255.0&gateway=192.168.1.1&Submit=Save";
char ip[16],netmask[16],gateway[16];
uchar len[4]={0,0,0,0};
//*********************************************************************
//功能:把从网页接收到URL编码的数据进行解码,分离出ip,mask及gateway
//*********************************************************************
void DecodeAndProcessData(char *src)
{
uchar i,j;
char lan[4][24];
i=0;j=0;
while (*src != '\0')
{
switch(*src)
{
case '&':
len[i]=j;
j=0;
i++;
src++;
break;
default:
lan[i][j] =*src;
j++;
src++;
break;
}
}
len[3]=j;
for(i=0;i<3;i++)
{
for(j=0;j<len[i];j++)
{
if(i==0)
ip[j]=lan[i][j+3]; //ip address
if(i==1)
netmask[j]=lan[i][j+5]; //subnet mask
if(i==2)
gateway[j]=lan[i][j+8]; //default gateway
}
ip[len[0]-3] = '\0';
netmask[len[1]-5] = '\0';
gateway[len[2]-8] = '\0';
}
}
//*********************************************************************
//rtn=0:无输入的值
//rtn=1:输入的值无效
//rtn=2:输入的值有效
//*********************************************************************
uchar DataCheck(char *src, uchar bytes)
{
uchar i,j;
uchar rtn,diginum[4];
if (bytes == 0)
{
rtn = 0;
return rtn;
}
j=0;
for(i=0;i<4;i++)
diginum[i]=0;
for (i = 0; i < bytes; i++)
{
if ((*src < '0' || *src > '9') && *src != '.') //不为数字或'.'
{
diginum[j]=0;
break;
}
else
{
switch(*src)
{
case '.':
j++;
src++;
break;
default: //数字
diginum[j]++;
src++;
break;
}
}
}
for(i=0;i<4;i++)
{
if (diginum[i]==0 || diginum[i]>3)
{
rtn = 1;
break;
}
else
rtn=2;
}
return rtn;
}
int main(void)
{
FILE *fp;
int i,j,nStatus;
int ContentLength; /*数据长度*/
char *pRequestMethod; /* METHOD属性值 */
char c,*p;
char buf[70];
setvbuf(stdin,NULL,_IONBF,0); /*关闭stdin的缓冲*/
printf("Content-Type: text/plain\n\n");
printf("<TITLE>Response</TITLE>\n");
/* 从环境变量REQUEST_METHOD中得到METHOD属性值 */
/*pRequestMethod = getenv("REQUEST_METHOD");
if (pRequestMethod == NULL)
{
printf("<P><H1>ERROR: Server failed</H1>\n");
exit(1);
}
if (strncmp(pRequestMethod,"POST",4)== 0)
{
p = getenv("CONTENT_LENGTH"); //从环境变量CONTENT_LENGTH中得到数据长度
if (p!=NULL)
{
ContentLength = atoi(getenv("CONTENT_LENGTH"));
}
else
{
ContentLength = 0;
}
if (ContentLength <= 30)
{
printf("<P><H1>ERROR: Please input the IP address!</H1>\n");
exit(1);
}
else if (ContentLength > MAXLEN)
{
printf("<P><H1>ERROR: The data too long</H1>\n");
exit(1);
}
else
{
i = 0;
while (i < ContentLength) { //从stdin中得到Form数据
c = fgetc(stdin);
InputBuffer[i++] = c;
}
InputBuffer[i] = '\0';
ContentLength = i;*/
//printf("%s\n",InputBuffer);
//数据解码得到ip地址,子网掩码netmask,及网关gateway
DecodeAndProcessData(InputBuffer);
/*for(i=0;i<4;i++)
printf("len[%d]=%d ",i,len[i]);
printf("\n");
for(i=0;i<len[0]-3;i++)
printf("%c",ip[i]);
printf("\n");
for(i=0;i<len[1]-5;i++)
printf("%c",netmask[i]);
printf("\n");
for(i=0;i<len[2]-8;i++)
printf("%c",gateway[i]);
printf("\n");*/
//检查数据的合法性,如:192.168.192.192
i = DataCheck(ip,len[0]-3);//检查ip
printf("%d\n",i);
if (i == 0) //没有输入数据
{
printf("<P><H1>ERROR: Please input the IP address.</H1>\n");
exit(1);
}
else if(i == 1) //数据错误
{
printf("<P><H1>ERROR: Please check the IP address.</H1>\n");
exit(1);
}
i = DataCheck(netmask,len[1]-5);//检查mask
printf("%d\n",i);
if (i == 1) //数据出错
{
printf("<P><H1>ERROR: Please check the Subnet mask.</H1>\n");
exit(1);
}
else if (i == 0) //没有输入netmask,取缺省的255.255.255.0
{
strncpy(netmask,"255.255.255.0",13);
len[1] = 18;
netmask[13] = '\0';
}
i = DataCheck(gateway,len[2]-8);//检查gateway
printf("%d\n",i);
if (i == 1) //数据出错
{
printf("<P><H1>ERROR: Please check the gateway.</H1>\n");
exit(1);
}
else if (i == 0) //没有输入网关,根据输入的ip地址取值xxx.xxx.xxx.1
{
j = 0;
//xxx.xxx.xxx.
for (i = 0; i < len[0]-3; i++)
{
switch(ip[i])
{
case '.':
j++;
gateway[i] = ip[i];
break;
default:
gateway[i] = ip[i];
break;
}
if( j == 3) break;
}
//xxx.xxx.xxx.1
gateway[i+1]= '1';
len[2] = i+10;
gateway[i+2] = '\0';
}
/*printf("%d %d %d %d\n",len[0],len[1],len[2],len[3]);
for(i=0;i<len[0]-3;i++)
printf("%c",ip[i]);
printf("\n");
for(i=0;i<len[1]-5;i++)
printf("%c",netmask[i]);
printf("\n");
for(i=0;i<len[2]-8;i++)
printf("%c",gateway[i]);
printf("\n");*/
//printf("<P><H1>success: configuration ok</H1>\n");
//至此,输入的数据合法
sprintf(buf, "ifconfig eth0 %s netmask %s &", ip,netmask);
nStatus = system(buf);
if ((nStatus != -1) && ( WIFEXITED(nStatus) && WEXITSTATUS(nStatus) == 0))
{
sprintf(buf, "route add default gw %s netmask %s &", gateway,netmask);
system(buf);
fp = fopen("/etc/init.d/rcS", "w+");
if (fp == NULL)
{
printf("Sorry, modify failed ! Please retry to do.\n");
exit(1);
}
else
{
//把设置写入到启动文件中,使得修改的参数重启设备之后也照样生效
sprintf(buf, "/sbin/ifconfig eth0 %s netmask %s\r\n", ip,netmask);
fputs(buf, fp);
sprintf(buf, "/sbin/route add default gw %s netmask %s\r\n", gateway,netmask);
fputs(buf, fp);
fclose(fp);
//此处根据新的IP地址打开新网页
printf("IP, Mask, Gateway Modify Success\n");
exit(0);
}
}
else
{
printf("Sorry, The IP address modify failed!\n");
fclose(fp);
exit(1);
}
//}
//}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -