精华内容
下载资源
问答
  • 简单的CGI服务器

    千次阅读 2018-05-19 14:57:00
    CGI服务器主要是通过把服务器本地标准输入,输出或者文件重定向到网络连接中,这样我们就能够通过向标准输入,输出缓冲区中发送信息,达到在网络连接中发送信息的效果.,(简单理解。。。。) 这里主要注意点是我们要进行...

    CGI服务器主要是通过把服务器本地标准输入,输出或者文件重定向到网络连接中,这样我们就能够通过向标准输入,输出缓冲区中发送信息,达到在网络连接中发送信息的效果.,(简单理解。。。。)
    这里主要注意点是我们要进行fflush(),通过dup进行重定向
    cgi.c

    #include <sys/socket.h>
    #include <errno.h>
    #include <string.h>
    #include <arpa/inet.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    #define LISTENQ 100
    
    int main(int argc,char** argv) {
        if (argc != 2) {
            printf("please add <port>");
            return 1;
        }
        int sockfd;
        if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0) {
            printf("socket error: %s\n",strerror(errno));
            return 1;
        }
        struct sockaddr_in addr;
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = htonl(INADDR_ANY);
        addr.sin_port = htons(atoi(argv[1]));
        if (bind(sockfd,(struct sockaddr*)&addr,sizeof(addr)) < 0) {
            printf("bind error: %s\n",strerror(errno));
            return 1;
        }
        if (listen(sockfd,LISTENQ) < 0) {
            printf("listen error: %s\n",strerror(errno));
            return 1;
        }
        int connfd;
        for ( ; ;) {
            if ((connfd = accept(sockfd,NULL,NULL)) < 0) {
                if (errno == EINTR) {
                    continue;
                }
                printf("accept error: %s\n",strerror(errno));
                return 1;
            }
            int ret = close(STDOUT_FILENO);
            if (ret < 0) {
                printf("close error: %s",strerror(errno));
                exit(1);
            }
            if (dup(connfd) < 0) {
                printf("dup error: %s\n",strerror(errno));
                return 1;
            }
            printf("which is server send by STDOUT_FILENO\n");
            fflush(stdout);
            close(connfd);
        }
        return 0;
    }

    通过telnet测试:

    这里写图片描述

    展开全文
  • 最近在学python3,但用用python3写的cgi服务器脚本英文显示正常,但无法显示中文。不知为什么?百度了N天最终找到解决办法。 在脚本前加上如下两句即可正常显示中文。 import codecs, sys sys.stdout = codecs....

    最近在学python3,但用用python3写的cgi服务器脚本英文显示正常,但无法显示中文。不知为什么?百度了N天最终找到解决办法。

    在脚本前加上如下两句即可正常显示中文。

    import codecs, sys
    sys.stdout = codecs.getwriter('utf8')(sys.stdout.buffer)


    具体原理尚不清楚。

    展开全文
  • 这段时间在学Python,今天开始进入到CGI编程,示例中有个简单CGI Server的例子,代码如下:webserver.py:webdir = "." #html files directoryport = 8000 #server portimport os, sysfrom BaseHTTPServer import...

    这段时间在学Python,今天开始进入到CGI编程,示例中有个简单CGI Server的例子,代码如下:

    webserver.py:

    页面CGI为cgi101.py:

    HTML页面为:

    先运行webserver.py(我是在Ubuntu上,用sudo python webserver.py)启动了server,然后在Firefox中访问:http://localhost:8000/cgi101.html

    结果Firefox中弹出下载cgi101.py脚本的对话框,而不是运行cgi返回结果,server终端中显示:

    说明os.execve权限出问题了,解决方法如下,将cgi101.py的权限设为777,如果还是不行的话,要将整个cgi目录的权限设为777(例如,本例中使用命令chmod -R 777 cgi-bin)

    然后就可以了。

    Good Luck!

    PS: Happy New Year !

    展开全文
  • boa服务器实现CGI功能

    千次阅读 2018-06-15 08:57:03
    CGI简介 CGI 是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能。CGI 应用程序能与浏览器进行交互,还可通过数据库API 与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据。格式化为...

    CGI简介

            CGI 是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能。CGI 应用程序能与浏览器进行交互,还可通过数据库API 与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据。格式化为HTML文档后,发送给浏览器,也可以将从浏览器获得的数据放到数据库中。几乎所有服务器都支持CGI,可用任何语言编写CGI,包括流行的C、C ++、VB 和Delphi 等。CGI 分为标准CGI 和间接CGI两种。标准CGI 使用命令行参数或环境变量表示服务器的详细请求,服务器与浏览器通信采用标准输入输出方式。间接CGI 又称缓冲CGI,在CGI 程序和CGI 接口之间插入一个缓冲程序,缓冲程序与CGI 接口间用标准输入输出进行通信。

    简而言之:CGI就是web服务器可以调用的其他程序,该程序将输出重定向,在该程序中通过printf生成html,通过管道将数据发给web服务器,完成交互。


    boa CGI实现

    1.boa获取到数据时,执行process_requests()-->读取http头read_header()--->process_header_end();根据头部信息,获取到该请求为CGI

    2.执行init_cgi()

    int init_cgi(request * req)
    {
        int child_pid;
        int pipes[2];
        int use_pipes = 0;
    
        SQUASH_KA(req);
    
        if (req->is_cgi) {
            if (complete_env(req) == 0) {        //设置环境变量
                return 0;
            }
        }
    #ifdef FASCIST_LOGGING
        {
            int i;
            for (i = 0; i < req->cgi_env_index; ++i)
                fprintf(stderr, "%s - environment variable for cgi: \"%s\"\n",
                        __FILE__, req->cgi_env[i]);
        }
    #endif
    
        if (req->is_cgi == CGI || 1) {
            use_pipes = 1;                //使用管道
            if (pipe(pipes) == -1) {
                log_error_time();
                perror("pipe");
                return 0;
            }
    
            /* set the read end of the socket to non-blocking */
            if (set_nonblock_fd(pipes[0]) == -1) {        //设置读管道为非阻塞
                log_error_time();
                perror("cgi-fcntl");
                close(pipes[0]);
                close(pipes[1]);
                return 0;
            }
        }
    
        child_pid = fork();        //创建子进程,用于启动cgi程序,程序执行完成后退出boa
        switch(child_pid) {
        case -1:
            /* fork unsuccessful */
            log_error_time();
            perror("fork");
    
            if (use_pipes) {
                close(pipes[0]);
                close(pipes[1]);
            }
            send_r_error(req);
            /* FIXME: There is aproblem here. send_r_error would work
               for NPH and CGI, but not for GUNZIP.  Fix that. */
            /* i'd like to send_r_error, but.... */
            return 0;
            break;
        case 0:
            /* child */
            if (req->is_cgi == CGI || req->is_cgi == NPH) {
                char *foo = strdup(req->pathname);
                char *c;
    
                if (!foo) {
                    WARN("unable to strdup pathname for req->pathname");
                    _exit(1);
                }
                c = strrchr(foo, '/');
                if (c) {
                    ++c;
                    *c = '\0';
                } else {
                    /* we have a serious problem */
                    log_error_time();
                    perror("chdir");
                    if (use_pipes)
                        close(pipes[1]);
                    _exit(1);
                }
                if (chdir(foo) != 0) {
                    log_error_time();
                    perror("chdir");
                    if (use_pipes)
                        close(pipes[1]);
                    _exit(1);
                }
            }
            if (use_pipes) {
                close(pipes[0]);
                /* tie cgi's STDOUT to it's write end of pipe */
                if (dup2(pipes[1], STDOUT_FILENO) == -1) {        //将写管道重定向到标准输出,在cgi中使用printf,数据就会被发送到管道中
                    log_error_time();
                    perror("dup2 - pipes");
                    close(pipes[1]);
                    _exit(1);
                }
                close(pipes[1]);
                if (set_block_fd(STDOUT_FILENO) == -1) {        //设置管道为阻塞
                    log_error_time();
                    perror("cgi-fcntl");
                    _exit(1);
                }
            } else {
                /* tie stdout to socket */
                if (dup2(req->fd, STDOUT_FILENO) == -1) {
                    log_error_time();
                    perror("dup2 - fd");
                    _exit(1);
                }
                /* Switch socket flags back to blocking */
                if (set_block_fd(req->fd) == -1) {
                    log_error_time();
                    perror("cgi-fcntl");
                    _exit(1);
                }
            }
            /* tie post_data_fd to POST stdin */
            if (req->method == M_POST) { /* tie stdin to file */
                lseek(req->post_data_fd, SEEK_SET, 0);
                dup2(req->post_data_fd, STDIN_FILENO);
                close(req->post_data_fd);
            }
            /* Close access log, so CGI program can't scribble
             * where it shouldn't
             */
            close_access_log();
    
            /*
             * tie STDERR to cgi_log_fd
             * cgi_log_fd will automatically close, close-on-exec rocks!
             * if we don't tied STDERR (current log_error) to cgi_log_fd,
             *  then we ought to close it.
             */
            if (!cgi_log_fd)
                dup2(devnullfd, STDERR_FILENO);
            else
                dup2(cgi_log_fd, STDERR_FILENO);
    
            if (req->is_cgi) {
                char *aargv[CGI_ARGC_MAX + 1];
                create_argv(req, aargv);
                execve(req->pathname, aargv, req->cgi_env);        //启动cgi程序
            } else {
                if (req->pathname[strlen(req->pathname) - 1] == '/')
                    execl(dirmaker, dirmaker, req->pathname, req->request_uri,
                          NULL);
    #ifdef GUNZIP
                else
                    execl(GUNZIP, GUNZIP, "--stdout", "--decompress",
                          req->pathname, NULL);
    #endif
            }
            /* execve failed */
            WARN(req->pathname);
            _exit(1);
            break;
    
        default:
            /* parent */
            /* if here, fork was successful */
            if (verbose_cgi_logs) {
                log_error_time();
                fprintf(stderr, "Forked child \"%s\" pid %d\n",
                        req->pathname, child_pid);
            }
    
            if (req->method == M_POST) {
                close(req->post_data_fd); /* child closed it too */
                req->post_data_fd = 0;
            }
    
            /* NPH, GUNZIP, etc... all go straight to the fd */
            if (!use_pipes)
                return 0;
    
            close(pipes[1]);
            req->data_fd = pipes[0];            //保存读管道的fd
    
            req->status = PIPE_READ;            //状态置为PIPE_READ
            if (req->is_cgi == CGI) {
                req->cgi_status = CGI_PARSE; /* got to parse cgi header */
                /* for cgi_header... I get half the buffer! */
                req->header_line = req->header_end =
                    (req->buffer + BUFFER_SIZE / 2);
            } else {
                req->cgi_status = CGI_BUFFER;
                /* I get all the buffer! */
                req->header_line = req->header_end = req->buffer;
            }
    
            /* reset req->filepos for logging (it's used in pipe.c) */
            /* still don't know why req->filesize might be reset though */
            req->filepos = 0;
            break;
        }
    
        return 1;                //more to do
    }
    3.下一次轮询中,程序回到process_request,状态为PIPE_READ,准备读取管道中的数据。读取后,继续轮询,直至全部读取完毕,状态置为PIPE_WRITE,将数据发送给客户端。(正是由于boa的这种轮询机制,使得它可以处理多个请求而不会卡住)


    展开全文
  • Web服务器CGI的配置

    千次阅读 2016-12-09 20:00:21
    Web服务器CGI的配置 CGI程序运行在Web服务器端,Web服务器可以是Apache,Nginx等 GGI程序可以是Python,Ruby,Perl,Shell,C/C++等 配置 apache默认加载cgi模块(若没加载,先加载): LoadModule cgi_...
  • CGI脚本服务器环境配置

    千次阅读 2014-03-05 20:56:22
    第六章公共网关接口入门中,需要对服务器的配置文件进行一些必要的配置后,才能使服务器解析python脚本。PS:其实现在Apache服务器配合使用mod_python模块来完成对python脚本的解析,这一方法使用的比较多。本文暂不...
  • 服务器CGI模式的运行机制

    千次阅读 2015-10-29 01:13:56
    PHP在Apache中有三种工作方式的区别:(1)CGI模式(2)Apache模块化(DLL)(3)fastCGI模式(4)CLI命令行模式 这里将详细介绍CGI
  • CGI(Common Gateway Interface),通用网关接口,它是一段程序,运行在服务器上如:HTTP服务器,提供同客户端HTML页面的接口。 二、网页浏览 为了更好的了解CGI是如何工作的,我们可以从在网页上点击一个链接或URL的...
  • http服务器cgi交互过程

    千次阅读 2016-05-24 11:53:18
    在处理cgi GET 表单时,服务器发送给cgi程序是通过环境变量发送的,并且GET的表单内容存放在QUERY_STRING中,因此,在服务器cgi程序通信之前,会先把GET表单进行解析,并建立环境变量。 同时,由于cgi程序是通过...
  • 《JxWeb服务器》之CGI模块

    千次阅读 2011-09-06 16:53:40
    网上很多CGI教程,却很少有关于当自己写的Web服务器怎么支持CGI的教程,接下来就是讨论这方面的知识。(本人水平有限,如有错误,望指教) CGI的全称是Common Gateway Interface——通用网关接口。 简单来讲:...
  • 一个支持 cgi 的简易 http 服务器

    千次阅读 2016-08-26 20:21:35
    arm-linux-gcc -o cgi-test.cgi cgi-test.c 修改 /etc/init.d/rcS 添加 /sbin/boa 以开机启动 boa 4. 测试 在本机浏览器里面输入: http://192.168.2.100/cgi-bin/cgi-test.cgi 可以看到 ...
  • 下面就讲解其中的一种方法,这种方法在网上的博客上还没有看到过,使用的环境是windows Server2012 ,IIS管理器,使用上面讲过的CGI脚本模块在IIS上实现CGI 下面开始简单讲解我的脚本模块,主要实现的是微信后台...
  • 基于CGI协议的HTTP服务器项目

    千次阅读 2018-08-19 12:13:40
    HTTP服务器
  • 目标服务器上存在CGI默认目录 信息泄露:资源定位可预测 低 1 查看 漏洞URL: http://www.iotsoft.tk/include 详细描述: CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器...
  • 树莓派WEB服务器(Boa)CGI编程入门

    千次阅读 2017-07-20 18:06:22
    通过上一个课程“Boa基本设置与使用”的学习... 下面通过一个CGI编程实例来学习,WEB服务器的动态编程技术。“体重指数(BMI)计算器”,用户输入自己的身高与体重后点击计算,服务器就会计算出BMI数值。 课程资源(程
  • CGI 原理解析
  • WEB服务器CGI接口功能的实现
  • 我用arm-linux-gcc -o test.cgi test.c这个命令吧这个c文件编译为cgi文件后放入boa服务器下的ScriptAlias /cgi-bin/ /var/www/cgi-bin/文件下。在浏览器中输入ip+/test.cgi,但是一直提示我下载是为什么呢?谢谢!
  • Web服务器CGI的关系

    千次阅读 2017-02-15 10:35:08
    什么是WEB服务器(IIS、Nginx、Apache) WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供...CGI,FastCGICGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交
  • 实现简单HTTP服务器-图片与CGI

    千次阅读 2015-07-29 12:51:21
    并不复杂,大概300行,就可以实现发送图片,和执行CGI程序将结果返回给客户端。具体实现过程服务器代码:代码量比较少,而且添加了一些注释,简明易懂。 csapp.h是该书的通用头文件,定义了一些常量,以及进一步...
  • //模拟了服务器端 httpd 进程启动 cgi的过程, //完整展现了 get,post 方法支持
  • 嵌入式boa服务器:502 Bad Gateway The CGI was not CGI/1.1 compliant.  这段时间做boa嵌入式服务器移植,一直出现这个错误排除不了。 一、问题:   网页显示:  502 Bad Gateway  The CGI was not CGI...
  • 操作系统:Ubuntu12.04 LTS boa下载地址(但是我找不到…):... 我是其他网站找到的资源,但是忘了网址了,所以我直接上云盘资源 ... 可以参考:Ubuntu下boa服务器的配置与搭建 cgi:直接终端安装 sudo apt-get ...
  • CGI工作原理及其WEB服务器开发

    千次阅读 2006-08-31 09:11:00
    1、CGI工作机理 CGI即公共网关接口(Common Gateway Interface)是在WEB服务器上定义了 WEB客户请求与应答的一种方法。客户向服务器的请求只要属于CGI范围,就启 动WEB服务器的一个CGI(网关)程序。它的任务是把客户...
  • Cgi服务

    2019-07-06 09:33:38
    ​ Python和其他脚本语言有一个不同的点,就是自带web服务器,我们在工作当中常用web服务器:Apache...3、在目录对应的命令行启动了cgi服务器: python -m http.server --cgi 4、同一网段就可以访问了 1、同一网段的...
  • CGI与WEB服务器的响应头

    千次阅读 2014-02-07 15:07:39
    我们知道 CGI 除了文本外还可以输出其他不同的资料例如图片、声音等数据流,为了让  WEBSEVER能辨认不同的数据型态,所以CGI 的输出包括两部分,前面的是相应头告诉  Server要输出的信息属于何种MIME类型,...
  • 基于windows IIS的C语言CGI WEB服务器环境搭建

    万次阅读 热门讨论 2012-08-07 23:12:54
    不过离开大学之后很久没有碰过WEB了,最近看到嵌入式中的涉及到的web服务器,了解到了CGI编程,就想赶紧试一试。对于cgi,不算接触,但是还是听说过之前,对于纯粹写普通网站的人来说CGI却是很古老的东西了,之前
  • 嵌入式WEB服务器BOA和CGI

    千次阅读 2011-01-19 17:52:00
    嵌入式WEB服务器常见的有lighttpd shttpd thttpdboa mathopd minihttpdappwebgoahead========================================================================嵌入式WEB服务器BOA的移植方法(一)2007-2-26 16:20...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 143,047
精华内容 57,218
关键字:

cgi服务器