2016-02-23 3 views
1

Я пишу простой сервер HTTP и я получаю файл не существует возвращаемое значение, если файл существуетоткрыто (файл) не существует, когда файл на самом деле существует

printf("%s\n", html_path); 
if ((fd = open(html_path, "r")) >= 0){ //file found 

    stat(file_name, &st); 
    file_size = st.st_size; 
    printf("%d\n", file_size); 
    while (read(fd, response, RCVBUFSIZE) > 0){ 

    } 
} 
else { //file not found 
    strcpy(response, "404 File not found\n"); 
    send(clntSocket, response, 32, 0); 
} 

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

/mounts/u-zon-d2/ugrad/kmwe236/HTML/index.html

к сведению, что этот путь находится на сервере, который мы используем в нашем университете. это путь, который показывает, когда я командую pwd

Я подтвердил, что файл существует. что-то не так с моим путем?

+5

Первое, что наблюдается: Возможно ли, что вы смешаете открытый и открытый? «r» будет соответствовать fopen, для открытия вы должны пройти O_RDONLY. –

+1

Откуда у вас функция 'open'? Если предполагается, что это системный вызов 'open (2)', то он имеет другой прототип, и вы должны написать 'open (html_path, O_RDONLY)'. Или, может быть, вы хотели использовать 'fopen (3)'? В любом случае, если это не удается, это не означает, что файл не существует: могут быть другие проблемы, например, у вас нет надлежащих прав доступа. Используйте 'strerror (3)' для печати фактической причины ошибки. – gudok

ответ

1

open не имеет второго параметра в качестве строки. Вы используете open с параметрами fopen. Для веб-сервер FOPEN, fprintf, fclose является лучшим Choise тогда более низкоуровневая открыта, читать ...

Приветствия, Chris

2

Был ошибка открытия файла, но вы не знаете, что это потому, что файл не был найден, потому что вы не проверяли значение errno.

В разделе else добавьте следующее:

else { //file not found 
    // copy the value of errno since other function calls may change its value 
    int err = errno; 
    if (err == ENOENT) { 
     strcpy(response, "404 File not found\n"); 
     send(clntSocket, response, 32, 0); 
    } else { 
     printf("file open failed: error code %d: %s\n", err, strerror(err)); 
    } 
} 

Если файл на самом деле не существует, вы будете обрабатывать ошибки должным образом. Если нет, вы будете печатать сообщение об ошибке, сообщающее вам, что произошло.

Вы также вызываете неправильный код open. Второй параметр - int, содержащий флаги. Чтобы открыть файл для чтения, используйте O_RDONLY.

0

Необходимо проверить, где выполняется программа, поскольку она попытается открыть путь относительно этого местоположения. Для проверки использования:

char cwd[1024]; 
getcwd(cwd, sizeof(cwd)); 
puts(cwd); 

Тогда вы можете сцепить свой путь с помощью:

strncat(cwd, html_path, 100); 

Вы можете обнаружить, что вы должны пойти на один каталог или что-то, то найти файл, который вы ищете.

Также обратите внимание, что если вы отлаживаете свою программу через gdb, она может выполняться из другого местоположения из вашего обычного местоположения сборки, что может затруднить обнаружение ошибок.