C Socket сервер программирования отправить файл - PullRequest
1 голос
/ 26 октября 2019

В настоящее время у меня проблемы с программированием на сокете C. Мне необходимо использовать следующую команду curl в качестве поведения клиента для запроса файла с сервера.

curl -v SERVER_ADDRESS --request-target FILENAME для отправки с сервера

Пока что я могу создать сервер, разобрать заголовки и обработать запрос PUT. Но у меня проблемы с запросом GET, который отправляет файл с сервера на клиент. Мой код не будет создавать, открывать и писать файл на клиенте. И вот часть, которую я не могу решить.

    //cl is value returned by accept()
       fd = open(name, O_RDONLY);
       if (fd<0){
         write(cl, "HTTP/1.1 404 Not Found\r\n", sizeof("HTTP/1.1 404 Not Found\r\n"));
         close(cl);
       }
       else{
         contentLength = 0;
         temp = read(fd, newbuffer, 32768);
         while(temp>0){
           write(cl, newbuffer, temp);
           contentLength = contentLength+temp;
           temp = read(fd, newbuffer, 32768);
         }
      sprintf(message, "HTTP/1.1 200 OK\r\nContent-Length: %d", contentLength);
      strcat(message, "\r\n\r\n");
      write(cl, message, sizeof(message));

Помогает заранее.

1 Ответ

1 голос
/ 27 октября 2019

Заголовок HTTP содержит строку состояния и поля заголовка, включая Content-length тела. Тело HTTP должно следовать за заголовком. Но ваш код открывает файл и немедленно записывает содержимое на клиент, и только после этого вы пишете заголовок. Другими словами: вы пишете тело до заголовка вместо тела после заголовка.

Помимо этого написания заголовок тоже неверен: sizeof(message)это не длина сообщения, а размер буфера или указателя (неясно, поскольку в показанном вами объявлении нет объявления message).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...