正在阻止Windows上的套接字

Blocking sockets on Windows

本文关键字:套接字 Windows      更新时间:2023-10-16

我试图在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 OKrn")));
    sock.send(boost::asio::buffer(std::string("Content-Length: ") + std::to_string(body.size()) + "rnrn"));
    sock.send(boost::asio::buffer(body));
    Sleep(1000); // The body would not be sent without this
    return 0;
}

根据这篇文章,在windows上,只有当内核的套接字缓冲区用完时,send方法才会阻塞。

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

我想补充这一点作为评论,但我没有足够的观点,很抱歉。