Предисловие: я просто использую C, так что простите за мою некомпетентность. Причина этой проблемы, вероятно, основная.
Проблема: я пытаюсь прочитать файл и передать его через HTTP через сокет. По какой-то причине результат printf
ранее прочитанного файла зависит от того, какая часть последующего кода включена.
Вот мой код.
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <netinet/in.h>
int main()
{
// open a file to serve
FILE *file;
file = fopen("index.html", "r");
if (file == NULL)
{
printf("Failed to open file.");
exit(EXIT_FAILURE);
}
// Get file content
char file_content[1024];
if (fgets(file_content, 1024, file) != NULL)
{
fclose(file);
// Add header to file content
char http_header[2048] = "HTTP/1.1 200 OK\r\n\n";
strncat(http_header, file_content, 1028);
// This output varies depending on inclusion of proceeding code.
printf("%s", http_header);
// create a socket
int server_socket;
server_socket = socket(AF_INET, SOCK_STREAM, 0);
// define the address
struct sockaddr_in server_address;
server_address.sin_family = AF_INET;
server_address.sin_port = htons(8001);
server_address.sin_addr.s_addr = INADDR_ANY;
bind(server_socket, (struct sockaddr *) &server_address, sizeof(server_address));
listen(server_socket, 1);
int client_socket;
while (1)
{
client_socket = accept(server_socket, NULL, NULL);
send(client_socket, http_header, sizeof(http_header), 0);
close(client_socket);
}
return 0;
}
}
Если я закомментирую все, что находится за оператором printf
, я получу ожидаемый результат ..
HTTP/1.1 200 OK
<html><body>Hi</body></html>
Но если я запускаю весь код, я получаю это ...
HTTP/1.1 200 OK
Если я смогу хоть немного улучшить свой вопрос, дайте мне знать, как это сделать. Спасибо.
fclose(file);
иreturn 0;
за пределы проверкиif(fgets(..))
. Эти вещи должны происходить независимо от того, возвращаетfgets
NULL или нет. - person yano   schedule 05.01.2018\n
, и ваша программа не завершается из-за бесконечного цикла, поэтому выходной буфер никогда не сбрасывается. Либо выйдите из бесконечного цикла, либо добавьте в вывод завершающий символ новой строки. - person Mark Benningfield   schedule 05.01.2018fflush(stdout);
послеprintf
.printf
буферизуется по строкам,fflush(stdout);
будет очищать вручнуюstdout
. - person yano   schedule 05.01.2018"HTTP/1.1 200 OK\r\n\n"
должна быть"HTTP/1.1 200 OK\r\n\r\n"
- каждая строка должна заканчиваться на\r\n
. Однако вряд ли это будет вашей непосредственной проблемой. - person Jonathan Leffler   schedule 05.01.2018