Asynchronously writing data from streambuf while appending to it
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}
I like to implement a "fire and forget" kind of stream where I may asynchronously append data that is to be written during writing. Can asio::streambuf
be safely used for that?
asio::streambuf send_buffer;
bool flushing = false;
asio::ip::tcp::socket socket;
// may be called by timers, read handlers, whatever
void new_data_handler(const char* data, size_t size) {
send_buffer.sputn(data, size);
flush();
}
void flush() {
if (flushing || send_buffer.size() == 0) return;
flushing = true;
asio::async_write(socket, send_buffer, [&](auto, auto) {
// error handling
// as per doc data is consumed from the buffer automatically
flushing = false;
flush(); // not sure if this even needs to be called
});
}
While the lifetime of the streambuf
itself is clear, I am concerned that adding new data will invalidate any buffers that view into its memory. That would be find if this is isolated to within handlers, but I cannot find any documentation as to whether that is true or not.
It appears that
socket.async_write_some(send_buffer, (auto, auto){});
does not work at all, it would require send_buffer.data()
- which would be invalidated by operations on send_buffer
as is documented.
I have also considered asio::buffered_write_stream
, but it seems that it does not provide a simple way to dump data in a guaranteed non-blocking way.
The underlying sockets are tcp and ssl sockets. All handlers are executed in the same strand.
c++ boost io boost-asio
add a comment |
I like to implement a "fire and forget" kind of stream where I may asynchronously append data that is to be written during writing. Can asio::streambuf
be safely used for that?
asio::streambuf send_buffer;
bool flushing = false;
asio::ip::tcp::socket socket;
// may be called by timers, read handlers, whatever
void new_data_handler(const char* data, size_t size) {
send_buffer.sputn(data, size);
flush();
}
void flush() {
if (flushing || send_buffer.size() == 0) return;
flushing = true;
asio::async_write(socket, send_buffer, [&](auto, auto) {
// error handling
// as per doc data is consumed from the buffer automatically
flushing = false;
flush(); // not sure if this even needs to be called
});
}
While the lifetime of the streambuf
itself is clear, I am concerned that adding new data will invalidate any buffers that view into its memory. That would be find if this is isolated to within handlers, but I cannot find any documentation as to whether that is true or not.
It appears that
socket.async_write_some(send_buffer, (auto, auto){});
does not work at all, it would require send_buffer.data()
- which would be invalidated by operations on send_buffer
as is documented.
I have also considered asio::buffered_write_stream
, but it seems that it does not provide a simple way to dump data in a guaranteed non-blocking way.
The underlying sockets are tcp and ssl sockets. All handlers are executed in the same strand.
c++ boost io boost-asio
See stackoverflow.com/a/12801042/85371
– sehe
Nov 24 '18 at 15:46
add a comment |
I like to implement a "fire and forget" kind of stream where I may asynchronously append data that is to be written during writing. Can asio::streambuf
be safely used for that?
asio::streambuf send_buffer;
bool flushing = false;
asio::ip::tcp::socket socket;
// may be called by timers, read handlers, whatever
void new_data_handler(const char* data, size_t size) {
send_buffer.sputn(data, size);
flush();
}
void flush() {
if (flushing || send_buffer.size() == 0) return;
flushing = true;
asio::async_write(socket, send_buffer, [&](auto, auto) {
// error handling
// as per doc data is consumed from the buffer automatically
flushing = false;
flush(); // not sure if this even needs to be called
});
}
While the lifetime of the streambuf
itself is clear, I am concerned that adding new data will invalidate any buffers that view into its memory. That would be find if this is isolated to within handlers, but I cannot find any documentation as to whether that is true or not.
It appears that
socket.async_write_some(send_buffer, (auto, auto){});
does not work at all, it would require send_buffer.data()
- which would be invalidated by operations on send_buffer
as is documented.
I have also considered asio::buffered_write_stream
, but it seems that it does not provide a simple way to dump data in a guaranteed non-blocking way.
The underlying sockets are tcp and ssl sockets. All handlers are executed in the same strand.
c++ boost io boost-asio
I like to implement a "fire and forget" kind of stream where I may asynchronously append data that is to be written during writing. Can asio::streambuf
be safely used for that?
asio::streambuf send_buffer;
bool flushing = false;
asio::ip::tcp::socket socket;
// may be called by timers, read handlers, whatever
void new_data_handler(const char* data, size_t size) {
send_buffer.sputn(data, size);
flush();
}
void flush() {
if (flushing || send_buffer.size() == 0) return;
flushing = true;
asio::async_write(socket, send_buffer, [&](auto, auto) {
// error handling
// as per doc data is consumed from the buffer automatically
flushing = false;
flush(); // not sure if this even needs to be called
});
}
While the lifetime of the streambuf
itself is clear, I am concerned that adding new data will invalidate any buffers that view into its memory. That would be find if this is isolated to within handlers, but I cannot find any documentation as to whether that is true or not.
It appears that
socket.async_write_some(send_buffer, (auto, auto){});
does not work at all, it would require send_buffer.data()
- which would be invalidated by operations on send_buffer
as is documented.
I have also considered asio::buffered_write_stream
, but it seems that it does not provide a simple way to dump data in a guaranteed non-blocking way.
The underlying sockets are tcp and ssl sockets. All handlers are executed in the same strand.
c++ boost io boost-asio
c++ boost io boost-asio
asked Nov 23 '18 at 13:29
ZulanZulan
16k63373
16k63373
See stackoverflow.com/a/12801042/85371
– sehe
Nov 24 '18 at 15:46
add a comment |
See stackoverflow.com/a/12801042/85371
– sehe
Nov 24 '18 at 15:46
See stackoverflow.com/a/12801042/85371
– sehe
Nov 24 '18 at 15:46
See stackoverflow.com/a/12801042/85371
– sehe
Nov 24 '18 at 15:46
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53447623%2fasynchronously-writing-data-from-streambuf-while-appending-to-it%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53447623%2fasynchronously-writing-data-from-streambuf-while-appending-to-it%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
See stackoverflow.com/a/12801042/85371
– sehe
Nov 24 '18 at 15:46