我正在尝试做一个最小的服务器来回答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();
}
答案 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 Format和RFC7231 204 No Content。