0

作成した単純なCGIプログラムを呼び出すために非常に単純なHTTPサーバーを作成しましたが、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 でそれを考慮する必要があります。

おそらく他の人から聞くと思いますが、彼らはなぜあなたがこれを試みているのか知りたがるでしょう...私はそれを学問的演習または単なる好奇心と考えます...しかし、あなたがしたいことの1つは、 CGI ではなく、HTTP サーバー自体で応答コードとステータスを返す責任があります。

于 2012-12-08T05:44:35.290 に答える