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

C++ boost::asio http服务器无法向邮递员返回有效响应,c++,http,boost-asio,C++,Http,Boost Asio,我试图做一个最小的服务器来响应http请求。我认为这部分是有效的,因为当我发送答案时,会话是断开的,但当我使用诸如Postman之类的工具时,我会收到一条消息,如“无法获得任何响应” 我还不太了解网络,我想我可能只是不知道一些http概念:) 以下是我使用的代码: #define _SECURE_SCL 0 #include <boost/asio.hpp> #include <iostream> using namespace std; using namespace

我试图做一个最小的服务器来响应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();
}
\define\u SECURE\u SCL 0
#包括
#包括
使用名称空间std;
使用名称空间boost::asio;
使用名称空间boost::asio::ip;
//
//TCP会话
//
类TcpSession:公共启用\u共享\u从此
{
uint8_t mData[4096];
tcp::socket-mSocket;
无符号int-mTcpSessionId;
公众:
TcpSession(tcp::socket&&iSocket,unsigned int&&iTcpAudioSessionId)
:mSocket(移动(iSocket)),
mTcpSessionId(iTcpAudioSessionId)
{}
~TcpSession(){}
void start(){
多里德();
}
私人:
void doRead(){
共享的自我(来自于此()的共享);
mSocket.async\u read\u some(缓冲区(mData,4096),
[this,self](boost::system::error\u code ec,size\u t iBytesReceived)
{
国际单项体育联合会(欧共体){
无法您的HTTP响应:

"HTTP / 1.1 200 OK\r\n\r\n"
格式错误,因为
HTTP
/
1.1
之间不应存在任何空格。 此外,由于您是使用
200 OK
响应进行回复,因此响应应包含一个
内容长度
为零的字段,即:

"HTTP/1.1 200 OK\r\ncontent-length: 0\r\n\r\n"
或者您可以只发送
204无内容
,即:

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

有关http概念的更多信息,请参阅:和。

关于boost::asio的小建议,
send
作为
socket
的成员函数是不安全的,它可能无法传输所有数据。如果您想确信消息的所有内容都会被发送,请使用
boost::asio::write
作为自由函数-它会阻塞,直到完全邮件被发送了。我这么做了,奇怪的是,我无法从邮递员那里得到“官方”的答复……有趣的是,我开始失眠,第一次尝试就得到了积极的结果。我猜这部分问题是在邮递员身上,刚刚看到了两篇关于代理的类似问题的帖子。