В настоящее время я пытаюсь изучить протокол HTTP, экспериментируя с минимальным сервером HTTP, созданным с boost :: asio, вот и все:
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[8192];
tcp::socket mSocket;
unsigned int mTcpSessionId;
public:
TcpSession(tcp::socket && iSocket, unsigned int && iTcpSessionId) :
mSocket(move(iSocket)),
mTcpSessionId(iTcpSessionId) {}
~TcpSession() {}
void start() {
doRead();
}
private:
void doRead() {
shared_ptr<TcpSession> self(shared_from_this());
mSocket.async_read_some( buffer(mData, 8192),
[this, self](boost::system::error_code ec, size_t iBytesReceived)
{
if (ec.value() == 10058) { // Socket already closed
return;
}
else if (ec) {
cout << "Session error : " << ec.value() << " " << ec.message() << endl;
return;
}
if (iBytesReceived > 0) {
cout << string(reinterpret_cast<char*>(mData), iBytesReceived) << endl;
write(mSocket, buffer("HTTP/1.1 204 No Content\r\n\r\n"));
mSocket.shutdown(socket_base::shutdown_both);
}
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.value() << " " << ec.message() << endl;
}
accept();
});
}
}; // end of TcpServer
int main() {
io_service ioService;
TcpServer mTcpServer(ioService, 2112);
ioService.run();
}
Когда я отправляю запрос на этот сервер с почтальоном, я получаю сообщение «Не удалось получить ответ». Когда я пытаюсь сделать то же самое с Бессонницей, я получаю совершенно ожидаемый ответ.
В поисках проблемы я понимаю, что Почтальон потребовал бы от меня использовать системный прокси для получения сообщения. Я уже повеселился с RestBed и CPPREST, но у меня никогда не было такого короля проблем. Я понимаю, что CPPREST и RestBed должны делать что-то еще для управления / переноса ответа, но что?
Что делают CPPREST и RestBed, а я нет? Нужен ли конкретный заголовок, чтобы ответы моего сервера были более приемлемыми? Или, может быть, я должен настроить мой акцептор / сокет по-другому?