Я пытаюсь сделать минимальный сервер, отвечающий на 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();
}