我尝试在Windows上实现一个带有阻塞套接字的简单http服务器。基本上,我有一个简单的服务器,只有在退出之前发生网络连接时才将数据写入套接字。问题是,如果我没有延迟进程退出,那么最后socket.send
没有效果。写入此套接字应该阻塞,直到所有数据都被写入。
我曾尝试使用write的完成条件,使用socket的non_blocking方法。我仍然遇到同样的问题。
请注意,问题不会发生在Linux上。
以下是代码:
#include <boost/asio.hpp>
int main(int argc, char *argv[]) {
char *address = "0.0.0.0";
char *port = "8180";
boost::asio::io_service io_service;
boost::asio::ip::tcp::acceptor acceptor(io_service);
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query(address, port);
boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(query);
acceptor.open(endpoint.protocol());
acceptor.bind(endpoint);
acceptor.listen();
boost::asio::ip::tcp::socket sock(io_service);
acceptor.accept(sock);
std::string body("Hello, World!");
sock.send(boost::asio::buffer(std::string("HTTP/1.1 200 OK\r\n")));
sock.send(boost::asio::buffer(std::string("Content-Length: ") + std::to_string(body.size()) + "\r\n\r\n"));
sock.send(boost::asio::buffer(body));
Sleep(1000); // The body would not be sent without this
return 0;
}
答案 0 :(得分:2)