http: сервер boost :: asio не может вернуть действительный ответ почтальону - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь сделать минимальный сервер, отвечающий на http запросы. Я думаю, что это частично работает, поскольку сеанс отключается, когда я отправляю ответ, но когда я использую такой инструмент, как Почтальон, я получаю сообщение типа «Не удалось получить ответ».

Пока не очень много знаю о сети, наверное, я просто не в курсе некоторых концепций http:)

Вот код, который я использую:

#define _SECURE_SCL 0
#include <boost/asio.hpp>
#include <iostream>
using namespace std;
using namespace boost::asio;
using namespace boost::asio::ip;

//
// TCP Session
//
class TcpSession : public enable_shared_from_this<TcpSession>
{
  uint8_t      mData[4096];
  tcp::socket  mSocket;  
  unsigned int mTcpSessionId;

public:
  TcpSession(tcp::socket && iSocket, unsigned int && iTcpAudioSessionId) 
  : mSocket(move(iSocket)),
    mTcpSessionId(iTcpAudioSessionId) 
  {}

  ~TcpSession() {}

  void start() {
    doRead();
  }

private:

  void doRead() {
    shared_ptr<TcpSession> self(shared_from_this());

    mSocket.async_read_some( buffer(mData, 4096),
      [this, self](boost::system::error_code ec, size_t iBytesReceived)
    {
      if(ec) {
        cout << "Session error : " << ec.value() << " " << ec.message() << endl;
        return;
      }

      if (iBytesReceived > 0) {
        cout << string(reinterpret_cast<char*>(mData), iBytesReceived) << endl;
        mSocket.send(buffer("HTTP / 1.1 200 OK\r\n\r\n"));
      }

      doRead();
    });
  }

}; // end of TcpSession


//
// TCP Server
//
class TcpServer
{
  tcp::acceptor mAcceptor;
  tcp::socket   mSocket;
  unsigned int  mTcpSessionCount;

public:
  TcpServer(io_service& iService, const short iPort) :
    mAcceptor(iService, tcp::endpoint(tcp::v4(), iPort)),
    mSocket(iService),
    mTcpSessionCount(0) {
    mAcceptor.set_option(tcp::acceptor::reuse_address());
    accept();
  }

private:
  void accept() {
    mAcceptor.async_accept(mSocket, [this](boost::system::error_code ec) {
      if(!ec) {
        make_shared<TcpSession>(move(mSocket), mTcpSessionCount++)->start();
      }
      else {
        cout << "Server error message " << ec.message() << endl;
      }

      accept();
    });
  }
}; // end of TcpServer


int main() {
  io_service ioService;
  TcpServer mTcpServer(ioService, 2112);
  ioService.run();
}

1 Ответ

1 голос
/ 01 июня 2019

Ваш HTTP-ответ:

"HTTP / 1.1 200 OK\r\n\r\n"

плохо сформирован, так как между HTTP, / и 1.1 не должно быть пробелов. Кроме того, поскольку вы отвечаете с ответом 200 OK, ответ должен содержать нулевое поле content-length, т. Е .:

"HTTP/1.1 200 OK\r\ncontent-length: 0\r\n\r\n"

или вы могли бы просто отправить 204 No Content вместо этого, т. Е .:

"HTTP/1.1 204 No Content\r\n\r\n"

Подробнее о понятиях http см .: Формат сообщения RFC7230 и RFC7231 204 Нет содержимого .

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