.exe файл выдает исключение при открытии файла - PullRequest
0 голосов
/ 30 ноября 2010

Я пытаюсь написать CGI-скрипт на c ++, который печатает обратный сетевой путь (используя traceroute) с веб-сервера на IP-адрес клиента, вызывающего сценарий CGI.

Когда я запускаю программу в Visual Studio, она работает нормально (создает процесс, печатает результат в файл "C: /result.out", открывает файл, печатает каждую строку из файла, закрывает файл) НО после компиляции и пытаясь запустить только свой файл .exe, он выбрасывает исключение. Что я могу сделать, чтобы заставить работать .exe? Как примечание, я использую Windows XP и Visual C ++ 2008

Вот код:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <process.h>
#include <conio.h>

int main()
{
    char *line, *command, *userIp;

    printf("Content-Type:text/html\n\n");
    printf("<html><head></head><br/>");
    printf("<body><br/>");

    line    = (char*)malloc(255*sizeof(char));
    command = (char*)malloc(10*sizeof(char));
    userIp  = (char*)malloc(30*sizeof(char));
    //userIp = getenv("REMOTE_ADDR"); // use a default IP until program works 
    strcpy(command,"tracert ");
    strcpy(userIp,"74.125.87.104");

    strcat(command,userIp);
    strcat(command," > C:/result.out");
    // create command "tracert 74.125.87.104 > C:/result.out"

    printf("%s",command);
    system(command);
    FILE *f;
    f = fopen("C:/result.out","r");  // open C:/result.out and read line - by - line
    strcpy(line,"");
    while(!feof(f)){
      fgets(line,255,f);
      printf("%s\n",line);
    }
    fclose(f);
    printf("<br/>Test running OK<br/>");
    printf("</body></html>");
    getch();
    return 0;
}

Ответы [ 2 ]

3 голосов
/ 30 ноября 2010

Скорее всего, ваш веб-сервер (разумно) не имеет разрешения на запись в c: \. Либо используйте правильное расположение для временных файлов, либо попросите tracert передать результаты обратно в исполняемый файл, чтобы вы могли захватить их.

0 голосов
/ 30 ноября 2010

Ну, следующие две строки вызывают переполнение буфера

strcat(command,userIp);
strcat(command," > C:/result.out");

Так что это, вероятно, результат сбоя.

Пожалуйста, не используйте термин «Исключение», если не выдается исключение, и поскольку вы пишете код C, что маловероятно. Так что это не исключение.

Вместо запуска команды с использованием system () и передачи результата в файл с помощью команды popen () она запускает команду и направляет вывод в поток, который можно прочитать как файл (но без последствия записи в файловую систему).

FILE *f;
f = popen(command,"r");  // run the command. The std out goes to the FILE stream
    ^^^^^^
strcpy(line,"");
while(!feof(f)){
  fgets(line,255,f);
  printf("%s\n",line);
}
fclose(f);
...