Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost asio中异步函数的错误字符_C++_Sockets_Boost_Boost Asio - Fatal编程技术网

C++ boost asio中异步函数的错误字符

C++ boost asio中异步函数的错误字符,c++,sockets,boost,boost-asio,C++,Sockets,Boost,Boost Asio,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::endC

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)));
}
void网络::Sread(void)
{
异步读取(this->socket,buffer(this->rbuffer),绑定(&Network::endRead,shared_from_this(),占位符::error));
}
无效网络::endRead(常量错误\代码和错误)
{
如果(!错误)
{
this->rcv_msg=this->rbuffer.c_数组();
std::cout rcv_msg Sread();
}
}
void Network::Swrite(std::string msg)
{
这->味精=味精;
异步写入(this->socket,buffer(this->msg,(int)this->msg.size()),绑定(&Network::endWrite,shared_from_this(),占位符::error));
}
无效网络::endWrite(常量错误\代码和错误)
{
如果(!错误)
{
这个->Sread();
}
}
tcp::套接字和网络::getSocket(无效)
{
返回(此->套接字);
}
网络::ptr网络::创建(io_服务和ios)
{
返回(ptr(新网络(ios));
}
当我使用telnet向服务器发送一个类似“Hello world”的字符串时,他会编写以下内容:


谁能告诉我服务器为什么要写很多未知字符?

看起来
rbuffer.c\u array()
不是以null结尾的字符串,而是一个字符数组。将字符数组打印到
cout
时,假定数组以null结尾,在这种情况下,会导致输出中包含数组结尾后的内存

在尝试打印数据之前,应先从数据中创建
std::string

std::string received(rbuffer.c_array(), rbuffer.size());
std::cout << received;
std::接收到字符串(rbuffer.c_数组(),rbuffer.size());

std::cout看起来
rbuffer.c_array()
不是以null结尾的字符串,而是一个字符数组。将字符数组打印到
cout
时,假定数组以null结尾,在这种情况下,会导致输出中包含数组结尾后的内存

在尝试打印数据之前,应先从数据中创建
std::string

std::string received(rbuffer.c_array(), rbuffer.size());
std::cout << received;
std::接收到字符串(rbuffer.c_数组(),rbuffer.size());

std::cout我相信您的readHandler(Network::endRead())缺少一个参数。无法确定从流中读取了多少字节。我的回调通常如下所示(但我调用async\u read\u some()):

然后,在打印之前,我将null终止从流中读取的字符串

编辑: 我对async_read_some()的调用如下所示:

    m_Socket.async_read_some(
        asio::buffer(m_RawBuffer, MaxBufferSize),
        bind(&HandleAsioRead,
             this,
             asio::placeholders::error,
             asio::placeholders::bytes_transferred));

我相信您的readHandler(Network::endRead())缺少一个参数。无法确定从流中读取了多少字节。我的回调通常如下所示(但我调用async\u read\u some()):

然后,在打印之前,我将null终止从流中读取的字符串

编辑: 我对async_read_some()的调用如下所示:

    m_Socket.async_read_some(
        asio::buffer(m_RawBuffer, MaxBufferSize),
        bind(&HandleAsioRead,
             this,
             asio::placeholders::error,
             asio::placeholders::bytes_transferred));

这与未以nul结尾的字符串有关吗?这与未以nul结尾的字符串有关吗?谢谢!多亏了你,它才起作用!!:)现在我将尝试构建一个包含头和结构的二进制协议。谢谢!多亏了你,它才起作用!!:)现在我将尝试构建一个包含头和结构的二进制协议。谢谢!这是很好的提示。多亏了这一点,我将在二进制协议中检查头的大小。:)这与二进制协议无关。回调中的“byteTransferred”表示从流中删除了多少字节。否则,您将无法知道缓冲区中有多少字节是有效的。您的“协议”应该指出您何时有完整的消息。如果您使用telnet连接到服务器,则消息可能以换行符结尾。谢谢!这是很好的提示。多亏了这一点,我将在二进制协议中检查头的大小。:)这与二进制协议无关。回调中的“byteTransferred”表示从流中删除了多少字节。否则,您将无法知道缓冲区中有多少字节是有效的。您的“协议”应该指出您何时有完整的消息。如果使用telnet连接到服务器,则消息可能以换行符结尾。