将char *转换为boost :: array以供套接字使用

时间:2014-10-31 09:03:14

标签: c++ arrays boost boost-asio

我想使用boost :: asio :: ip :: tcp :: socket的方法“read_some()”来填充表示为char *的缓冲区。

到目前为止,这是我的方法实现:

template<class charType>
int receive_some(charType* buffer, int size)
{
     int total_received = 0;

     boost::array<charType, size> buf;
     while (1)
     {
         int received = 0;
         boost::system::error_code error;
         received = _socket.read_some(boost::asio::buffer(buf), error);
         if (error == boost::asio::error::eof)
         { 
             break;
         }
         std::cout.write(buf.data(), received);
         total_received += received;
      }

    return total_received;

}

我的问题是我没有看到如何将我的charType *缓冲区转换为boost :: array buf。在进程结束时迭代我的boost :: array的元素来填充缓冲区对象似乎很昂贵......

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

template<class charType>
int receive_some(charType* buffer, int size)
{
     int total_received = 0;

     while (1)
     {
         int received = 0;
         boost::system::error_code error;
         received = _socket.read_some(boost::asio::buffer(buffer, size), error);
         if (error == boost::asio::error::eof)
         { 
             break;
         }
         std::cout.write(buffer, received);
         total_received += received;
      }

    return total_received;

}

boost::asio::buffer函数有很多重载,允许从不同类型的源创建一个asio缓冲区。

值得注意的是,size必须是要读入buffer的字节数,而不是charType的数量。

额外提示:正如评论所指出的那样,该模板是可疑的,你能用它做的最好是直接写入宽字符串,但最好是在read_some函数中的其他地方(实际上它甚至可能)在网络功能中你处理字节而不是字符,所以你最好把一个简单的char*甚至void*作为buffer参数的类型。