簡體   English   中英

關於boost :: asio套接字和阻塞

[英]About boost::asio sockets and blocking

所以我嘗試了boost :: asio並測試了阻塞回聲示例。 它們似乎似乎沒有完全阻止它。 至少不是我預期的方式。

是否可以擺脫任何類型的緩沖或什么是最小的緩沖區大小? 看起來10000字節太小了。

以下代碼在阻塞之前運行2次寫入。 如果我將boost :: asio :: transfer_exactly(10000)參數添加到寫入,它仍然是2. boost :: asio :: transfer_exactly(5000)讓我寫入5次。

那么這個網絡/ io / asio的工作原理是什么? 就像我只想發送一個字節並等待它到達另一端,沒有任何額外的通信。

服務器:

boost::asio::io_service io_service;

tcp::acceptor a(io_service, tcp::endpoint(tcp::v4(), 12346));
tcp::socket sock(io_service);

a.accept(sock);
sock.non_blocking(false);
boost::asio::socket_base::send_buffer_size option(10000);
sock.set_option(option);

while(true) {
    char data[10000];

    boost::asio::socket_base::bytes_readable bytes_readable_cmd(true);
    sock.io_control(bytes_readable_cmd);
    std::size_t bytes_readable = bytes_readable_cmd.get();
    if(bytes_readable) {
        /**/
    }

    boost::asio::write(sock, boost::asio::buffer(data, 10000));
    printf("#\n");Sleep(10);
}

客戶:

boost::asio::io_service io_service;

tcp::resolver resolver(io_service);
tcp::resolver::query query(tcp::v4(), "localhost", "12346");
tcp::resolver::iterator iterator = resolver.resolve(query);

tcp::socket sock(io_service);
boost::asio::connect(sock, iterator);
sock.non_blocking(false);

我認為在這種情況下,只有在底層緩沖區已滿時才write實際塊。

msdn的引用適用於此:

成功完成發送功能並不表示數據已成功發送並接收到收件人。 此功能僅表示數據已成功發送。

如果傳輸系統中沒有可用的緩沖區空間來保存要傳輸的數據,則發送將阻止,除非套接字已置於非阻塞模式。

我嘗試寫入超過64KB(完全以65537開始)並在第一次調用時阻止。

這不是Asio的工作方式,而是TCP和套接字的工作原理。 這個答案也可能有所幫助。

我想你需要明確地從客戶端發送收據確認,即滾動你自己的應用層協議。

暫無
暫無

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

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