плохие персонажи с функцией асинхронности в boost asio - PullRequest
0 голосов
/ 16 ноября 2011

У меня проблема с передачей данных в boost :: asio. со следующим кодом:

server.cpp

void        Server::accept(void)
{
    Network::ptr connection = Network::create(this->my_acceptor.get_io_service());
    this->my_acceptor.async_accept(connection->getSocket(), bind(&Server::endCmd, this, connection, placeholders::error));
}

void        Server::endCmd(Network::ptr connection, const boost::system::error_code& error)
{
    if (!error)
        {
            connection->Swrite("BIENVENUE");
            this->accept();
        }
}

Network.cpp

void        Network::Sread(void)
{
    async_read(this->socket, buffer(this->rbuffer), bind(&Network::endRead, shared_from_this(), placeholders::error));
}

void            Network::endRead(const error_code& error)
{
    if (!error)
        {
            this->rcv_msg = this->rbuffer.c_array();
            std::cout << this->rcv_msg << std::endl;
            this->Sread();
        }
}

void            Network::Swrite(std::string msg)
{
    this->msg = msg;
    async_write(this->socket, buffer(this->msg, (int)this->msg.size()), bind(&Network::endWrite, shared_from_this(), placeholders::error));
}

void            Network::endWrite(const error_code &error)
{
    if (!error)
    {
        this->Sread();
    }
}

tcp::socket&    Network::getSocket(void)
{
    return (this->socket);
}

Network::ptr                Network::create(io_service &ios)
{
    return (ptr(new Network(ios)));
}

Когда я отправляю на сервер с помощью telnet строку типа «Hello world», он пишет следующее содержимое: bug with my serveur

Кто может сказать мне, почему сервер пишет много неизвестных символов?

Ответы [ 2 ]

2 голосов
/ 16 ноября 2011

Я полагаю, что ваш readHandler (Network :: endRead ()) отсутствует аргумент.Невозможно определить, сколько байтов было прочитано из потока.Мой обратный вызов обычно выглядит так (но я вызываю async_read_some ()):

void HandleAsioRead(const boost::system::error_code& rErrorCode,
                    std::size_t nBytesTransferred)

Тогда я завершу нулевую строку, прочитанную из потока перед печатью.вызов async_read_some () выглядит следующим образом:

    m_Socket.async_read_some(
        asio::buffer(m_RawBuffer, MaxBufferSize),
        bind(&HandleAsioRead,
             this,
             asio::placeholders::error,
             asio::placeholders::bytes_transferred));
1 голос
/ 16 ноября 2011

Похоже, rbuffer.c_array() это не строка с нулевым символом в конце, а просто массив символов.Печать символьного массива в cout предполагает, что массив завершается нулем, что в этом случае приводит к тому, что память после окончания массива включается в вывод.

Вы должны создать std::string изданные перед попыткой его распечатать:

std::string received(rbuffer.c_array(), rbuffer.size());
std::cout << received;

(при условии, что rbuffer имеет метод size() или что-то эквивалентное)

...