C-программа для CGI выдаёт ошибку неполных HTTP-заголовков - PullRequest
1 голос
/ 31 декабря 2011

Код программы My C:

#include <stdio.h>
int main(void) {
  printf("Content-Type: text/plain;charset=us-ascii\n\n");
  printf("Hello world\n\n");
  return 0;
}

Я скомпилировал его несколько раз, используя команды:

gcc -o first.cgi first.c
gcc first.c -o first.cgi
g++ first.c -o first.cgi

Когда я использую first.cgi в моей сети, это выдает ошибку:

  • Ошибка CGI

    Указанное приложение CGI ведет себя неправильно, поскольку не возвращает полный набор заголовков HTTP. Возвращаемые заголовки:
    Нераспознанный символ \ x90 в строке J: \ KKS_Sawdagger \ cgi-bin \ first.cgi 1.

Может кто-нибудь дать мне причину, пожалуйста?

1 Ответ

4 голосов
/ 31 декабря 2011

Одна возможность состоит в том, что HTTP требует, чтобы строки заканчивались CRLF ("\r\n"); фактически, большинство интернет-протоколов используют линии.

Теперь, есть некоторые смягчающие наблюдения, которые могут относиться к вашему коду. Стандарт C говорит, что текстовые потоки должны преобразовываться из локальных окончаний собственных строк в \n при вводе и из \n в локальные окончания внутренних строк при выводе. Вопрос будет: «Является ли stdout текстовым потоком или двоичным потоком в Windows?», И на этот вопрос я не знаю ответа (но «текст» - правдоподобное предположение - в этом случае код должно нормально работать на Windows).

Так как сообщение об ошибке идентифицирует проблему как байт 0x90, который не показан в коде, возможно, здесь есть что-то еще. Вы сами запускали программу?

Разве расширение для исполняемого файла не должно быть .exe в Windows? Возможно, ваша программа интерпретирует cmd.exe или какой-то другой интерпретатор команд для интерпретации какого-либо сценария, и он вам не очень нравится. (Тем не менее, ISTR указывает, что GCC в Windows добавляет суффикс .exe, поэтому фактические результаты из ваших компиляций равны first.cgi.exe.)

...