好的,这种行为让我疯狂了好几天了。我实现了一个非常简单的HTTP服务器,它逐个回答客户端请求。请求处理时间非常短(通常<1ms),因此在此开发阶段,不需要多线程请求处理。
服务器输出是根据每30秒获取一次的外部服务器上的JSON提要计算的。这是在一个单独的线程中完成的,它定期请求提要。
服务器代码如下所示:
boost::asio::io_service io_service;
tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), port));
// start updater (1)
boost::thread t(boost::bind(&update, boost::ref(io_service)));
while (true) {
tcp::socket sock(io_service);
acceptor.accept(sock);
std::vector<char> buffer(1023);
boost::system::error_code read_error;
size_t msgLen = sock.read_some(boost::asio::buffer(buffer), read_error);
std::string httpReq(msgLen, 0);
for (size_t i = 0; i < msgLen; i++) httpReq[i] = buffer[i];
std::stringstream ss(httpReq);
// suppressed HTTP request extraction from stringstream
// and request processing
std::stringstream ret;
// suppressed writes to ret
// output
std::ostringstream a;
writeHTTPHeader(&a, ret.str().size());
a << ret.str();
boost::system::error_code write_error;
boost::asio::write(trajServerSock, boost::asio::buffer(a.str()),
boost::asio::transfer_all(), write_error);
}
并且在(1)的线程startet中每隔30秒调用一次更新代码如下所示:
tcp::resolver resolver(io_service);
tcp::resolver::query query(getDomain(_url), "http");
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
tcp::resolver::iterator end;
boost::system::error_code error = boost::asio::error::host_not_found;
tcp::socket socket(io_service);
while (error && endpoint_iterator != end) {
socket.close();
socket.connect(*endpoint_iterator++, error);
}
if (error) return;
boost::asio::streambuf request;
std::ostream request_stream(&request);
request_stream << "GET " << _url << " HTTP/1.0\r\n";
request_stream << "Host: " << getDomain(_url) << "\r\n";
request_stream << "Accept: */*\r\n";
request_stream << "Connection: close\r\n\r\n";
std::cout << "Requesting " << "'GET " << _url << " HTTP/1.0'\n";
boost::asio::write(socket, request);
boost::asio::streambuf response;
std::istream response_stream(&response);
// process response
服务器和更新客户端都使用相同的io_service(由ref传递)。虽然这段代码工作得很好而且从不崩溃,但我在某些(并非所有!)机器上遇到了一种非常奇怪的行为。
如果我的服务器发送回客户端的答案非常长(通常大约200kb),并且客户端请求发生在更新线程获取JSON提要期间,答案将被裁剪到大约90kb < / strong>即可。我再说一遍,这只发生在一些机器上。服务器和更新客户端都不会产生任何错误,服务器输出只是过早地被裁剪。
我对ASIO很新,但我发现两个套接字之间存在某种并发性。
我们非常感谢任何帮助,我现在试着让它工作好几天。
编辑:我通过密切关注Boost的HTTP Server 3示例(http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/http/server3/)来解决问题。