Boost Asio async_send издает звуковой сигнал

Попытка написать клиент для типа сервера, который ведет себя как эхо-сервер. Когда я пытаюсь что-то отправить, издается звуковой сигнал. Я обнаружил, что проблема возникает в строке 356 (в моем редакторе) файла win_iocp_socket_service_base.ipp. Код является:

int result = ::WSASend(impl.socket_, buffers,
static_cast<DWORD>(buffer_count), &bytes_transferred, flags, op, 0);

Затем я сделал некоторые исследования.

Непрерывное повышение :: Asio читает здесь, в комментарии к ответу, кто-то сказал, когда двоичные данные записываются в std::cout,

Почему следующий код заставляет мой компьютер подавать звуковой сигнал? здесь, похоже, проблема та же. Они пришли к выводу, что «\ a» — это то, что произвело звук.

Отладка приложения, буфер функции API, о которой я упоминал ранее, содержит следующее:

"asd@ıııı2•Z\x1aP"

здесь «asd @» — моя строка, остальное меняется каждый раз, когда я отлаживаю, и я не знаю, что это такое. Теперь, вероятно, это та часть, из которой производится звук, но мой вопрос, как мне это предотвратить?

У меня есть следующая реализация односторонней функции «Корреспондент». Обратите внимание, что у меня также есть изолированный 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 я обнаружил, что эта проблема не связана с функцией чтения, но я опубликую ее здесь просто для уверенности.

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);
}

0

Решение

here "asd@" is my string, the rest changes every time when I debug

Буфер читается без заботы о его размере, добро пожаловать в C ++. Дай boost::asio::buffer размер буфера.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]