cgi-программа отладочного сервера - PullRequest
0 голосов
/ 01 июня 2011

Я пытаюсь сделать веб-сервер на C, который может обрабатывать запросы к динамическому содержимому.Часть веб-сервера уже закончена.я пытаюсь выполнить следующую команду:

http://localhost:1601/cgi-bin/test?3&7

с кодом теста программы выглядит следующим образом:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <assert.h>
#include <fcntl.h>
#include <errno.h>
#include <wordexp.h>
#define MAXLINE 300

int main(int narg, char * arg[]) {
    char *buf, *p;
    char arg1[MAXLINE], arg2[MAXLINE], content[MAXLINE];
    int n1=0, n2=0;

    /* Extract the two arguments */
    if ((buf = getenv("QUERY_STRING")) != NULL) {
    p = strchr(buf, '&');
    *p = '\0';
    strcpy(arg1, buf);
    strcpy(arg2, p+1);
    n1 = atoi(arg1);
    n2 = atoi(arg2);
    }

    /* Make the response body */
    sprintf(content, "Welcome to add.com: ");
    sprintf(content, "%sTHE Internet addition portal.\r\n<p>", content);
    sprintf(content, "%sThe answer is: %d + %d = %d\r\n<p>",
        content, n1, n2, n1 + n2);
    sprintf(content, "%sThanks for visiting!\r\n", content);

    /* Generate the HTTP response */
    printf("Content-length: %d\r\n", (int)strlen(content));
    printf("Content-type: text/html\r\n\r\n");
    printf("%s", content);
    if (fork()==0) {
        printf("asdfagloiauergauhfgaiudfhg");
        execvp("ls",arg);
        printf("child of adder error");
    }
    printf("%s", content);

    fflush(stdout);
    exit(0);
}
/* $end adder */

Он работает хорошо.Однако мне интересно, почему дочерний код (строка printf ("asdfagloiauergauhfgaiudfhg") и execvp) не распечатывался на выход веб-сервера.хотя все остальное в тестовом выводе правильно.

1 Ответ

1 голос
/ 01 июня 2011

Для начала вы устанавливаете заголовок Content-length равным длине контента, затем отправляете контент, затем отправляете больше данных в обоих потоках.Браузер имеет право игнорировать все после байтов длины содержимого в выходном потоке.

...