簡體   English   中英

在Windows上阻止套接字

[英]Blocking sockets on Windows

我嘗試在Windows上實現一個簡單的帶有阻塞套接字的http服務器。 基本上,我有一個簡單的服務器,當退出前發生網絡連接時,它僅將數據寫入套接字。 問題是如果我不延遲進程退出,最后一個socket.send將無效。 應該寫此套接字,直到所有數據寫入為止。 我試圖使用寫的完成條件,以使用套接字的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;
}

根據這篇文章,僅當內核用盡套接字緩沖區時,send方法才會在Windows上阻塞。

它還說,如果程序被殺死,則套接字將被強制關閉,未發送的數據將被丟棄。

我想添加此內容作為評論,但我沒有足夠的意思,對此表示遺憾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM