URL编码:
变量之间用&分开
变量与其对应值用=连接
空格符用+代替
控制字符用%接对应的16进制ASCII码代替
空格及不能打印的ASCII码是非法字符
getenv("REQUEST_METHOD");
可以得到POST 或者 GET;
POST通过CONTENET_LENGTH获取输入数据长度。
环境变量:
REQUEST_METHOD
CONTENT_TYPE
CONTENT_LENGTH
POST
QUERY_STRING
GET
CONTENT_FILE
REMOTE_ADDR
REMOTE_HOST
REMOTE_USER
PATH_INFO
例子,gcc -o scan.cgi scan.c
int main(int argc,char *argv[])
{
char *data;
char *reqmth;
char key[50],value[50],buf[256],cmd[64];
int len,i;
FILE *fp = NULL;
printf("content-key:text/html;charset=utf8 \n\n");
printf("<TITLE>WIFI Status</TITLE>");
printf("<H3>WIFI Status</h3>");
reqmth = getenv("REQUEST_METHOD");
printf("REQUEST_METHOD: %s\n",reqmth);
//POST method
if(strncmp(reqmth,"POST",4)==0)
{
len = atoi(getenv("CONTENT_LENGTH"));
fread(buf,len,1,stdin);
printf("<br>POST over!!,len:%d<br>Buf:%s<br>",len,buf);
fp=popen("iwlist ra0 scan | grep ESSID","r");
while(fgets(buf,sizeof(buf),fp))
{
printf("<br>BUF:<br>%s<br>",buf);
}
pclose(fp);
#if 0
for(i=0;i<len;i++)
{
if(buf[i] == '=')
{
buf[i] = ' ';
}
if(buf[i] == '&')
{
buf[i] = '\0';
sscanf(data,"%s %s",key,value);
printf("<br>%s = %s<br>",key,value);
if(strncasecmp(key,"ssid",4) == 0)
{
printf("key:%s,value:%s !\n",key,value);
sprintf(cmd,"iwconfig wlan0 essid %s",value);
system(cmd);
}
data = &buf[i+1];
}
}
#endif
}
//GET method
else
{
data=getenv("QUERY_STRING");
if(data==NULL)
printf("<p>Error:no data found!!!</p>");
else{
len = strlen(data);
sscanf(data,"name=%[^&]&pwd=%s",key,value);
printf("<p>len:%d ; name=%s</p>",len,key);
printf("<p>pwd=%s</p>",value);
printf("%s",data);
}
}
return 0;
}