5

複数の文字列を最初に 1 つの大きな文字列に結合せずに TCP 経由で送信したいのですが、ASIO のスキャッター ギャザー I/O インターフェイスでこれを実行できることを理解しています。ただし、実装でメモリエラーが発生し続けるため、何か間違ったことをしているに違いありません。以下のスニペット (コンパイル可能で実行可能) は、 I の場合に文字化けした文字列を返しますtelnet localhost 11211

#include <vector>
#include <string>
#include <boost/asio.hpp>

using namespace std;
using namespace boost::asio;
using namespace boost::asio::ip;

int main() {
    io_service service;
    tcp::acceptor acceptor(service, tcp::endpoint(tcp::v4(), 11211));
    tcp::socket sock(service);
    acceptor.accept(sock);
    if (!acceptor.is_open()) return 1;
    string s = "this is a really long string";
    vector<const_buffer> vec;
    vec.push_back(buffer(s));
    write(sock, buffer(vec));
}

ただし、実行すると正常に動作しますwrite(sock, buffer("this is a really long string"))。ここで何が欠けていますか?

4

2 に答える 2

7

The last line should be:

write(sock, vec);

Otherwise it's not "scatter-gather", because buffer free function always returns mutable_buffers_1, i.e. a single buffer. In your case the following buffer overload gets called:

template <typename PodType, typename Allocator>
inline mutable_buffers_1 buffer(std::vector<PodType, Allocator>& data)
{
  return mutable_buffers_1(mutable_buffer(data.size() ? &data[0] : 0, data.size() * sizeof(PodType)));
}

Since your vector is not a "vector of POD", it's treated incorrectly.

于 2013-03-12T09:36:00.340 に答える
3

この場合、書き込むためにバッファを渡す必要はありません。例の最後の文字列を次のように書き換えると

write(sock, vec);

問題はおそらく解決されます。

于 2013-03-12T09:35:02.527 に答える