在c语言写的cgi程序中如何获取URL传递的参数

时间:2021-07-13 04:55:50
例如在
1.html中通下面的js完成页面调转:
<script>
window.location.href = "abc.cgi?name1="+name1+"&name2="+name2+"+"&pass1="+pass1+";
</script>

在abc.cgi程序中如何获取页面传递的name1\name2\pass1的值显示在abc.cgi页面
第二种通过<form action="abc.cgi" method="POST">调转到abc.cgi
 这种情况如何获取name1\name2\pass1的值并显示在abc.cgi页面

13 个解决方案

#1


通过获取环境变量 query-string 得到"?"后面的字符串,然后你自己解析

对于post的数据,通过获取content-length来得到长度,然后存stdin读取。 也要自己解析

#2


因为是c语言也的cgi程序,对字符的处理不是很方便,实际上我就是想知道如何解析字符串,这是最难的地方。
希望有代码的实现·楼上的兄弟能否帮帮忙!

#3


嗯,首先你能确定你要的参数名。 并且知道query-string是这种形式:
para1=val1&para2=val2
那么你可以首先将他们拆开:

 比如要获取$_GET['action'];
   char * query_string = "para1=val1&para2=val2&para3=val3";

int main(){
    char * str = (char *)malloc(strlen(query_string)+1);
    char * index;
    memcpy(str, query_string, strlen(query_string)+1);
    int  i=0;
    char * get[100];

    while(NULL != (index = strchr(str, '&' ))){
        //printf("%s\n", index);
        get[i] = (char *)malloc(index-str + 1);
        strncpy(get[i++], str, index - str);
        strncpy(str, index + 1, strlen(str)-(index-str) + 1);
    }
    get[i] = (char*)malloc(strlen(str)+1);
    strncpy(get[i++], str, strlen(str)+1);
    for(int m=0; m<i; m++){
        printf("%s\n", get[m]);
        free(get[m]);
    }
}
~
这样,就会得到形如:
para1=val1
para2=val2
para3=val3
这样的参数。
然后你strchr 等号。。。。。

然后,你明白了吧?

#4


挺好的!!
我试过了!!
只是针对get方法的,
对于post方法楼上的兄弟能否指点一下!非常感谢!!!

#5


我用boa 服务器做了一个cgi 的程序不能运行,但是我使用下载文件cgi-2.05中的测试用的cgi程序是可以运行的. 

我的boa首页为:index.html 
<HTML> <HEAD> 
<meta http-equiv="Content-Type" content="text/html; charset=big5"> 
<TITLE>LINUX CGI NETwork Remoto Control </TITLE> 
</HEAD> 
<body bgcolor="#CCFFFF"> 
<p> </p> 
<center> 

<TABLE BORDER=0> 
<FORM ACTION="/var/www/cgi-bin/start.cgi" METHOD="POST"> 

<p> <tr> <td> <INPUT TYPE="RADIO" NAME=cb VALUE="1" CHECKED> 
<font color="#6600CC" SIZE="6">Motor start </font> </tr> </td> 

<tr> <td> <INPUT TYPE="RADIO" NAME=cb VALUE="2">  
<font color="#6600CC" SIZE="6">Motor stop </font> </tr> </td> </p> 
</TABLE>  <BR> 
<INPUT TYPE=SUBMIT VALUE="send"> </FORM> 
</CENTER> 
</BODY> </HTML> 

我的cgi程序如下:start.c  
#include  <stdio.h> 
#include  <fcntl.h> 
#include  <string.h> 
#include  <sys/ioctl.h> 
#include  <stdlib.h> 

int main(int argc, char **argv) 

 printf("Content-type:text/html \r\n\r\n"); 
 printf(" <html> <head> <title>LINUX CGI NETwork Remoto Control </title> </head>"); 
     printf(" <p>step motor is running </p>");} 
     printf(" <p>step motor is stoped </p>");} 
     printf("\ <html>"); 
     return 0; 


我通过armv4l-unknown-linux-gcc -o start.cgi start.c 来生成cgi,但是不能运行 

#6


重点在讨论post方法和get方法如何拆分参数就像“laruence ”说提出的解决方法!

#7


引用 4 楼 lihengzk 的回复:
挺好的!!
我试过了!!
只是针对get方法的,
对于post方法楼上的兄弟能否指点一下!非常感谢!!!

Post的话,应该是首先
获取环境变量content_length;
然后,从stdin中读取相应长度的数据

格式和get的一样

具体怎么样我也没有试过,你可以试试。:)

#8


#include <stdio.h>
  #include <stdib.h>
  main()
  {
   int,i,n;
  printf (″Content-type:text/plain\n\n″);
  n=0;
  if(getenv(″CONTENT-LENGTH″))
  n=atoi(getenv(CONTENT-LENGTH″));
  for (i=0;i<n;i++)
  putchar(getchar());
  putchar (′\n′);
  fflush(stdout);
  }

这个例子,简单的把post过来的数据回显给客户端。。

#9


引用 5 楼 sky040411 的回复:
我用boa 服务器做了一个cgi 的程序不能运行,但是我使用下载文件cgi-2.05中的测试用的cgi程序是可以运行的.

我的boa首页为:index.html
<HTML>  <HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=big5">
<TITLE>LINUX CGI NETwork Remoto Control  </TITLE>
</HEAD>
<body bgcolor="#CCFFFF">
<p>  </p>
<center>

<TABLE BORDER=0>
<FORM ACTION="/var/www/cgi-bin/start.cgi" METHOD="POST…

看看这个 http://dev.csdn.net/article/35/35030.shtm

#10


支持搂主,收藏

#11


"laruence"回答的非常的好,非常感谢!

#12


\r\n\r\n

#13


mark......

#1


通过获取环境变量 query-string 得到"?"后面的字符串,然后你自己解析

对于post的数据,通过获取content-length来得到长度,然后存stdin读取。 也要自己解析

#2


因为是c语言也的cgi程序,对字符的处理不是很方便,实际上我就是想知道如何解析字符串,这是最难的地方。
希望有代码的实现·楼上的兄弟能否帮帮忙!

#3


嗯,首先你能确定你要的参数名。 并且知道query-string是这种形式:
para1=val1&para2=val2
那么你可以首先将他们拆开:

 比如要获取$_GET['action'];
   char * query_string = "para1=val1&para2=val2&para3=val3";

int main(){
    char * str = (char *)malloc(strlen(query_string)+1);
    char * index;
    memcpy(str, query_string, strlen(query_string)+1);
    int  i=0;
    char * get[100];

    while(NULL != (index = strchr(str, '&' ))){
        //printf("%s\n", index);
        get[i] = (char *)malloc(index-str + 1);
        strncpy(get[i++], str, index - str);
        strncpy(str, index + 1, strlen(str)-(index-str) + 1);
    }
    get[i] = (char*)malloc(strlen(str)+1);
    strncpy(get[i++], str, strlen(str)+1);
    for(int m=0; m<i; m++){
        printf("%s\n", get[m]);
        free(get[m]);
    }
}
~
这样,就会得到形如:
para1=val1
para2=val2
para3=val3
这样的参数。
然后你strchr 等号。。。。。

然后,你明白了吧?

#4


挺好的!!
我试过了!!
只是针对get方法的,
对于post方法楼上的兄弟能否指点一下!非常感谢!!!

#5


我用boa 服务器做了一个cgi 的程序不能运行,但是我使用下载文件cgi-2.05中的测试用的cgi程序是可以运行的. 

我的boa首页为:index.html 
<HTML> <HEAD> 
<meta http-equiv="Content-Type" content="text/html; charset=big5"> 
<TITLE>LINUX CGI NETwork Remoto Control </TITLE> 
</HEAD> 
<body bgcolor="#CCFFFF"> 
<p> </p> 
<center> 

<TABLE BORDER=0> 
<FORM ACTION="/var/www/cgi-bin/start.cgi" METHOD="POST"> 

<p> <tr> <td> <INPUT TYPE="RADIO" NAME=cb VALUE="1" CHECKED> 
<font color="#6600CC" SIZE="6">Motor start </font> </tr> </td> 

<tr> <td> <INPUT TYPE="RADIO" NAME=cb VALUE="2">  
<font color="#6600CC" SIZE="6">Motor stop </font> </tr> </td> </p> 
</TABLE>  <BR> 
<INPUT TYPE=SUBMIT VALUE="send"> </FORM> 
</CENTER> 
</BODY> </HTML> 

我的cgi程序如下:start.c  
#include  <stdio.h> 
#include  <fcntl.h> 
#include  <string.h> 
#include  <sys/ioctl.h> 
#include  <stdlib.h> 

int main(int argc, char **argv) 

 printf("Content-type:text/html \r\n\r\n"); 
 printf(" <html> <head> <title>LINUX CGI NETwork Remoto Control </title> </head>"); 
     printf(" <p>step motor is running </p>");} 
     printf(" <p>step motor is stoped </p>");} 
     printf("\ <html>"); 
     return 0; 


我通过armv4l-unknown-linux-gcc -o start.cgi start.c 来生成cgi,但是不能运行 

#6


重点在讨论post方法和get方法如何拆分参数就像“laruence ”说提出的解决方法!

#7


引用 4 楼 lihengzk 的回复:
挺好的!!
我试过了!!
只是针对get方法的,
对于post方法楼上的兄弟能否指点一下!非常感谢!!!

Post的话,应该是首先
获取环境变量content_length;
然后,从stdin中读取相应长度的数据

格式和get的一样

具体怎么样我也没有试过,你可以试试。:)

#8


#include <stdio.h>
  #include <stdib.h>
  main()
  {
   int,i,n;
  printf (″Content-type:text/plain\n\n″);
  n=0;
  if(getenv(″CONTENT-LENGTH″))
  n=atoi(getenv(CONTENT-LENGTH″));
  for (i=0;i<n;i++)
  putchar(getchar());
  putchar (′\n′);
  fflush(stdout);
  }

这个例子,简单的把post过来的数据回显给客户端。。

#9


引用 5 楼 sky040411 的回复:
我用boa 服务器做了一个cgi 的程序不能运行,但是我使用下载文件cgi-2.05中的测试用的cgi程序是可以运行的.

我的boa首页为:index.html
<HTML>  <HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=big5">
<TITLE>LINUX CGI NETwork Remoto Control  </TITLE>
</HEAD>
<body bgcolor="#CCFFFF">
<p>  </p>
<center>

<TABLE BORDER=0>
<FORM ACTION="/var/www/cgi-bin/start.cgi" METHOD="POST…

看看这个 http://dev.csdn.net/article/35/35030.shtm

#10


支持搂主,收藏

#11


"laruence"回答的非常的好,非常感谢!

#12


\r\n\r\n

#13


mark......