Unix C ++ простой вопрос сервера: отправка данных обратно в браузер - PullRequest
0 голосов
/ 04 декабря 2009

Я создаю простой сервер Unix, написанный на C ++, который просто ожидает входящих соединений, а затем, когда соединение установлено, отправляет запрошенные данные обратно в браузер клиента для отображения. У меня все работает, кроме отправки данных клиенту. Вот как это должно работать:

  1. Я запускаю сервер и задаю номер порта (для этого примера я буду использовать 8181).

  2. Клиент открывает браузер и подключается к моему серверу, расположенному по адресу http://server.mysite.com:8181/test.txt, и пытается извлечь test.txt для просмотра.

  3. Сервер принимает входящее соединение. Он проверяет, существует ли файл. Если файл существует, он отправляет файл в браузер для просмотра.

Моя проблема в том, что я не уверен, как отправить данные обратно в браузер для просмотра. Я пытаюсь использовать системные вызовы Unix, чтобы добиться этого, так как считаю, что это все, что нужно для возврата данных.

Прямо сейчас все, что я делаю, это чтение () из файла в буфер массива символов и затем подача этого в команду write (socketID, buffer, strlen (buffer)). Когда я проверяю его, сервер правильно находит файл и считывает данные в буфер массива char, но команда write () каждый раз возвращает значение ошибки -1.

Я хотел бы получить его там, где подключен браузер, и затем иметь возможность просматривать text.txt в браузере, а также поддерживаемые браузером графические форматы.

Есть ли какой-нибудь способ обойти часть «чтение в буфер, затем запись этого буфера в сокет» и просто каким-то образом отправить файл прямо в браузер? Вот часть кода, с которым я сейчас работаю. Я только что прокомментировал другие части кода.

//create and bind socket. call listen()...
conn_socket = accept(socketInt, (struct sockaddr *)&caddr, (socklen_t *) &caddrLength);

recvInt = recv(conn_socket, requestedFileBuffer, 1023, 0);
if(recvInt > 0){
    //checks to see that the requestd file exists and correctly 
    //reads that file into char array "buffer"
    int writeInt = write(recvInt, buffer, strlen(buffer));//This is not working
cout << "writeInt is: " << writeInt << endl;// returns -1
}//end if

У кого-нибудь есть предложения? Если вам нужно, чтобы я опубликовал больше кода, я был бы рад сделать это, но я считаю, что проблема заключается в приведенном выше коде.

Спасибо за ваше время.

Ответы [ 2 ]

6 голосов
/ 05 декабря 2009

Когда вы говорите:

int writeInt = write(recvInt, buffer, strlen(buffer));

первый параметр write () должен быть сокетом для записи - вы передаете ему количество символов, возвращаемых recv ()

2 голосов
/ 05 декабря 2009

В дополнение к правильному ответу Нила, вы также можете рассмотреть возможность использования sendfile() вместо write(), если он доступен на вашей платформе, поскольку он обеспечивает гораздо более эффективный средство отправки файла, чем подход, который вы используете.

Если sendfile() недоступен, вы можете альтернативно использовать mmap(), чтобы отобразить файл в адресное пространство вашего процесса и передать полученный буфер в write(). Это спасет вас от копирования файла в локальный буфер. Однако mmap() может обеспечить усиление только в случае больших файлов. Как всегда, сравните ваш код, чтобы увидеть, стоит ли его использовать.

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