【问题标题】:Blocking sockets on Windows在 Windows 上阻塞套接字
【发布时间】:2016-05-18 11:56:01
【问题描述】:

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

【问题讨论】:

  • 在返回之前尝试正确关闭套接字。您的数据在发送后位于套接字缓冲区中,但如果您从进程返回并打开套接字,操作系统可能会在任意位置中断发送。

标签: c++ windows boost-asio


【解决方案1】:

根据this 的帖子,在 Windows 上,仅当内核用完套接字缓冲区时,发送方法才会阻塞。

也就是说如果程序被杀了,就强制关闭socket,丢弃未发送的数据。

我想将此作为评论添加,但我没有足够的意义,对此感到抱歉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-08
    • 2010-10-31
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    相关资源
    最近更新 更多