1

boost::asio を使用してクライアント サーバー アプリケーションを作成しようとしましたが、全体的にアプリケーションはうまく動作しますが、「WriteHandler」( async_write 関数) によって提供されるデータに関する問題に遭遇しました。 > サーバー) は、ファイアウォールによって、またはネットワーク カードを手動で無効にすることによって削除されます。

コード スニペットは次のとおりです。

void write(const CommunicatorMessage & msg, std::function<void(bool)> writeCallback)
        {
            io_service.dispatch(
                [this, msg, writeCallback]()
            {
                boost::asio::async_write(socket, boost::asio::buffer(msg.data(), msg.length()), [this, msg, writeCallback](boost::system::error_code ec, std::size_t length)
                {
                    writeCallback(ec != 0);
                    if (!ec)
                    {
                        LOG_DEBUG("Number of bytes written into the buffer: " << length << " Error code: " << ec);
                        LOG_DEBUG("Successfully send msg: " << msg);
                    }
                    else
                    {
                        LOG_ERROR("Failed sending msg: " << msg);
                        throw std::exception(ec.message().c_str());
                    }
                });
            });
        }

データがサーバーに到着しない場合でも、Writehandler からのデータは有効です (エラー コードは 0、bytes_transferred は正しい)。Wireshark でフロー全体を追跡しました (ここにスクリーンショットのリンクがあるリンクがあります) 。

4

1 に答える 1

2

async_writeが成功を送信した場合、カーネルのバッファーへの書き込みに成功したことを意味します。しかし、保証されていないパケットが配信されました。

于 2013-10-03T14:08:06.327 に答える