Boost Asio async_send 发出哔哔声
Boost Asio async_send produces beep sound
正在尝试为一种行为类似于回显服务器的服务器编写客户端。当我尝试发送内容时,它会发出哔哔声。我发现问题出现在 win_iocp_socket_service_base.ipp 文件的第 356 行(在我的编辑器上)。代码是:
int result = ::WSASend(impl.socket_, buffers,
static_cast<DWORD>(buffer_count), &bytes_transferred, flags, op, 0);
然后我做了一些研究。
Continuous boost::asio reads 在答案的评论中,有人说当二进制数据被写入 std::cout
.
Why does the following code make my computer beep? 看来问题是一样的。他们得出结论,'\a' 是产生声音的原因。
调试应用程序,我前面提到的API函数的缓冲区,包含以下内容:
"asd@ıııı2•Z\x1aP"
这里"asd@"是我的字符串,其余每次调试时都变了,我不知道它们是什么。现在,这可能是产生声音的部分,但我的问题是如何防止它?
我有以下单轮 "Correspond" 函数的实现。请注意,我还有一个独立的 Send()
函数实现,它可以与 ReadUntil()
显式配对以获得相同的结果。 Send()
和ReadUntil()
一起使用,还是会发出哔哔声。通常情况下,这不应该发生,因为我 不是 处理低级 API 函数,而是 Boost.Asio。我做错了什么吗?
代码
void Correspond(const std::string &data,
const std::string &delim,
std::vector<char> &response)
{
std::shared_ptr<std::vector<char>> localbuffer = std::make_shared<std::vector<char>>(data.begin(), data.end());
// pass shared_ptr to callback function to prolong the buffer's lifetime
// !!! perhaps a better buffer management is needed
socket.async_send(boost::asio::buffer(*localbuffer),
std::bind(&TCPClient::on_correspond,
this,
std::placeholders::_1,
std::placeholders::_2,
delim,
std::ref(response),
localbuffer));
}
和以下回调实现
void on_correspond(const boost::system::error_code& errorcode,
std::size_t sent,
const std::string &delim,
std::vector<char> &response,
const std::shared_ptr<std::vector<char>> &buffer)
{
if(errorcode) {
SLOGERROR(mutex, errorcode.message(), "on_correspond()");
}
if(sent == 0) {
SLOG(mutex, "0 bytes sent w/o errors", "on_correspond()");
}
ReadUntil(delim, response);
}
深入调试 API 后,我发现这个问题与读取功能无关,但我会 post 在这里只是为了确定。
void ReadUntil(const std::string &delim, std::vector<char> &response)
{
boost::asio::async_read_until(socket,
buffer,
delim,
std::bind(&TCPClient::on_readuntil,
this,
std::placeholders::_1,
std::placeholders::_2,
std::ref(response)));
}
void on_readuntil(const boost::system::error_code& errorcode,
std::size_t received,
std::vector<char> &response)
{
SLOG(mutex, "on_readuntil invoked", "on_readuntil()");
SLOG(mutex, received, "on_readuntil");
// !!! needs error handling, short-read handling and whatnot
if(errorcode) {
SLOGERROR(mutex, errorcode.message(), "on_readuntil()");
return;
}
if(received == 0) {
SLOG(mutex, "0 bytes received w/o errors", "on_readuntil()");
}
response.reserve(received);
std::copy(boost::asio::buffers_begin(buffer.data()),
boost::asio::buffers_begin(buffer.data()) + received,
std::back_inserter(response));
buffer.consume(received);
}
here "asd@" is my string, the rest changes every time when I debug
读取缓冲区而不关心它的大小,欢迎使用C++。给 boost::asio::buffer
缓冲区大小。
正在尝试为一种行为类似于回显服务器的服务器编写客户端。当我尝试发送内容时,它会发出哔哔声。我发现问题出现在 win_iocp_socket_service_base.ipp 文件的第 356 行(在我的编辑器上)。代码是:
int result = ::WSASend(impl.socket_, buffers,
static_cast<DWORD>(buffer_count), &bytes_transferred, flags, op, 0);
然后我做了一些研究。
Continuous boost::asio reads 在答案的评论中,有人说当二进制数据被写入 std::cout
.
Why does the following code make my computer beep? 看来问题是一样的。他们得出结论,'\a' 是产生声音的原因。
调试应用程序,我前面提到的API函数的缓冲区,包含以下内容:
"asd@ıııı2•Z\x1aP"
这里"asd@"是我的字符串,其余每次调试时都变了,我不知道它们是什么。现在,这可能是产生声音的部分,但我的问题是如何防止它?
我有以下单轮 "Correspond" 函数的实现。请注意,我还有一个独立的 Send()
函数实现,它可以与 ReadUntil()
显式配对以获得相同的结果。 Send()
和ReadUntil()
一起使用,还是会发出哔哔声。通常情况下,这不应该发生,因为我 不是 处理低级 API 函数,而是 Boost.Asio。我做错了什么吗?
代码
void Correspond(const std::string &data,
const std::string &delim,
std::vector<char> &response)
{
std::shared_ptr<std::vector<char>> localbuffer = std::make_shared<std::vector<char>>(data.begin(), data.end());
// pass shared_ptr to callback function to prolong the buffer's lifetime
// !!! perhaps a better buffer management is needed
socket.async_send(boost::asio::buffer(*localbuffer),
std::bind(&TCPClient::on_correspond,
this,
std::placeholders::_1,
std::placeholders::_2,
delim,
std::ref(response),
localbuffer));
}
和以下回调实现
void on_correspond(const boost::system::error_code& errorcode,
std::size_t sent,
const std::string &delim,
std::vector<char> &response,
const std::shared_ptr<std::vector<char>> &buffer)
{
if(errorcode) {
SLOGERROR(mutex, errorcode.message(), "on_correspond()");
}
if(sent == 0) {
SLOG(mutex, "0 bytes sent w/o errors", "on_correspond()");
}
ReadUntil(delim, response);
}
深入调试 API 后,我发现这个问题与读取功能无关,但我会 post 在这里只是为了确定。
void ReadUntil(const std::string &delim, std::vector<char> &response)
{
boost::asio::async_read_until(socket,
buffer,
delim,
std::bind(&TCPClient::on_readuntil,
this,
std::placeholders::_1,
std::placeholders::_2,
std::ref(response)));
}
void on_readuntil(const boost::system::error_code& errorcode,
std::size_t received,
std::vector<char> &response)
{
SLOG(mutex, "on_readuntil invoked", "on_readuntil()");
SLOG(mutex, received, "on_readuntil");
// !!! needs error handling, short-read handling and whatnot
if(errorcode) {
SLOGERROR(mutex, errorcode.message(), "on_readuntil()");
return;
}
if(received == 0) {
SLOG(mutex, "0 bytes received w/o errors", "on_readuntil()");
}
response.reserve(received);
std::copy(boost::asio::buffers_begin(buffer.data()),
boost::asio::buffers_begin(buffer.data()) + received,
std::back_inserter(response));
buffer.consume(received);
}
here "asd@" is my string, the rest changes every time when I debug
读取缓冲区而不关心它的大小,欢迎使用C++。给 boost::asio::buffer
缓冲区大小。