阻止Windows上的套接字

时间:2016-05-18 11:56:01

标签: c++ windows boost-asio

我尝试在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;
}

1 个答案:

答案 0 :(得分:2)

根据this帖子,在windows上,只有当内核用完套接字缓冲区时,send方法才会阻塞。

它还说如果程序被终止,则强制关闭套接字并丢弃未发送的数据。

我想将此添加为评论,但我没有足够的意见,抱歉。