boost :: asio http服务器无法向邮递员返回有效响应

时间:2019-05-31 13:55:29

标签: c++ http boost-asio

我正在尝试做一个最小的服务器来回答http请求。我认为它部分起作用,因为当我发送答案时会话已断开,但是当我使用Postman之类的工具时,我会收到诸如“无法获得任何响应”之类的消息。

我对网络还不了解很多,我想我可能只是不知道一些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 个答案:

答案 0 :(得分:1)

您的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 Message FormatRFC7231 204 No Content