处理表单,在cgic中提供了函数接口,可以调用,比如的到客户端传过来的字符串:
//enter flag
cgiFormString("flag", flag, 32)
其中"flag"为客户端post过来的data键值对的键,flag是cgi中定义的char数组,用于接收post过来的键值对的值。这样就得到了客户端传递过来的值。
cgi输出到浏览器其实是加载静态html格式文件,然后读到特定字符,然后将cgi得到的值替换掉特定字符,然后出去到浏览器,进行显示。
至于调用postgreSQL数据库,我不太清楚,但是用C/C++链接数据库是肯定没问题的,这个帮不到你了。
用C语言编写cgi程序的话,CGIC是非常流行的库,官方页面及下载地址为: www.boutell.com/cgic/#obtain 不少网站都有文件上传的功能,本文展示如何用CGIC库编写文件上传的服务端程序,最后给出一段简单的HTML代码,供大家测试使用。//upload.c#include #include #include #include #include #include"cgic.h"#define BufferLen 1024int cgiMain(void){ cgiFilePtr fileint targetFilemode_t modechar name[128]char fileNameOnServer[64]char contentType[1024]char buffer[BufferLen]char *tmpStr=NULLint sizeint got,tcgiHeaderContentType("text/html")//取得html页面中file元素的值,应该是文件在客户机上的路径名 if (cgiFormFileName("file", name, sizeof(name)) !=cgiFormSuccess) { fprintf(stderr,"could not retrieve filename\n")goto FAIL} cgiFormFileSize("file", &size)//取得文件类型,不过本例中并未使用 cgiFormFileContentType("file", contentType, sizeof(contentType))//目前文件存在于系统临时文件夹中,通常为/tmp,通过该命令打开临时文件。临时文件的名字与用户文件的名字不同,所以不能通过路径/tmp/userfilename的方式获得文件 if (cgiFormFileOpen("file", &file) != cgiFormSuccess) { fprintf(stderr,"could not open the file\n")goto FAIL} t=-1//从路径名解析出用户文件名 while(1){ tmpStr=strstr(name+t+1,"\\")if(NULL==tmpStr) tmpStr=strstr(name+t+1,"/")//if "\\" is not path separator, try "/" if(NULL!=tmpStr) t=(int)(tmpStr-name)else break} strcpy(fileNameOnServer,name+t+1)mode=S_IRWXU|S_IRGRP|S_IROTH//在当前目录下建立新的文件,第一个参数实际上是路径名,此处的含义是在cgi程序所在的目录(当前目录))建立新文件 targetFile=open(fileNameOnServer,O_RDWR|O_CREAT|O_TRUNC|O_APPEND,mode)if(targetFile<0){ fprintf(stderr,"could not create the new file,%s\n",fileNameOnServer)goto FAIL} //从系统临时文件中读出文件内容,并放到刚创建的目标文件中 while (cgiFormFileRead(file, buffer, BufferLen, &got) ==cgiFormSuccess){ if(got>0) write(targetFile,buffer,got)} cgiFormFileClose(file)close(targetFile)goto ENDFAIL: fprintf(stderr,"Failed to upload")return 1END: printf("File \"%s\" has been uploaded",fileNameOnServer)return 0} 假设该文件存储为upload.c,则使用如下命令编辑:gcc -Wall upload.c cgic.c -o upload.cgi 编译完成后把upload.cgi复制到你部署cgi程序的目录(通常命名为cgi-bin)。 正式部署时,请务必修改用open创建新文件那一行代码。把open的第一个参数设置为目标文件在服务器上存储的绝对路径,或者相对于cgi程序的相对路径。本例中,出于简单考虑,在cgi程序所在目录下创建新文件。楼上不懂不要瞎说关键是要输出Content-type和两个\r\n
#include <stdio.h>
int main(){
printf("Content-type: text/html\r\n\r\n")
printf("hello,world!")
return 0
}
编译改名就可以了
如果需要表单,请参考
http://www.cs.tut.fi/~jkorpela/forms/cgic.html
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)