⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ip.c

📁 通过arm开发板的web服务器(boa)获取表单提交的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 + -