0

我编写了一个非常简单的 HTTP 服务器来调用我编写的一个简单的 CGI 程序,但是我的 HTTP 服务器无法在我的浏览器上显示 CGI 程序的结果。我的 HTTP 服务器的部分代码如下。

while(1)
{
    struct sockaddr_in client_addr;
    int addrlen = sizeof(client_addr);

    /*Accept*/
    if((clientfd = accept(sockfd, (struct sockaddr *)&client_addr, (socklen_t*)&addrlen)) < 0)
    {
        perror("Accpet Error");
        close(sockfd);
        exit(-1);
    }
    else
    {
        /*Fork process*/
        if((child = fork()) < 0)
        {
            perror("Fork Error");
            close(sockfd);
            exit(-1);
        }
        else if(child == 0)
        {       
            int fd[2]; //pipe a fd
            close(sockfd); 
            setvbuf(stdin, NULL, _IONBF, 0);
            setvbuf(stdout, NULL, _IONBF, 0);
            setvbuf(stderr, NULL, _IONBF, 0);   
            buffer1.clear();
            buffer1.resize(VECTOR_SIZE);
            while(1)
            {
                if((res = recv(clientfd, buffer1.data(), buffer1.size(), 0)) > 0)
                {

                    string token = "QUERY_STRING=" + buffer1.data();
                    pipe(fd);
                    dup2(fd[1], STDOUT_FILENO);
                    close(fd[0]);
                    execlp("cgi", "cgi", NULL);
                     //if the bug fixed, will use `execvpe` here
                    cout << "fail" << endl;
                }


            }
        }
        else    
        {
            //exit(0);
            close(clientfd);
        }
    }

}   

而且,我的 CGI 程序只是 string reply = "HTTP/1.1 200 OK\nTEST"; cout << reply;
但浏览器无法显示结果并超时。

4

1 回答 1

0

您的 HTTP 响应和内容之间需要 2 个 CRLF。此外,如果不设置 Content-Type 标头,大多数浏览器可能不会显示内容。出于您的目的,您应该只设置 Content-Type: text/plain 测试目的。如果您打算提供其他 mime 类型,则需要在 CGI 中说明这一点。

正如您可能会从其他人那里听到的那样,他们会很好奇您为什么要尝试此操作...我将其归结为学术练习或只是出于好奇...但是您要做的一件事是将负责在 HTTP 服务器本身上返回响应代码和状态,而不是 CGI。

于 2012-12-08T05:44:35.290 回答