C++ boost::asio http服务器无法向邮递员返回有效响应
我试图做一个最小的服务器来响应http请求。我认为这部分是有效的,因为当我发送答案时,会话是断开的,但当我使用诸如Postman之类的工具时,我会收到一条消息,如“无法获得任何响应” 我还不太了解网络,我想我可能只是不知道一些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
#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
作为自由函数-它会阻塞,直到完全邮件被发送了。我这么做了,奇怪的是,我无法从邮递员那里得到“官方”的答复……有趣的是,我开始失眠,第一次尝试就得到了积极的结果。我猜这部分问题是在邮递员身上,刚刚看到了两篇关于代理的类似问题的帖子。