我想使用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的元素来填充缓冲区对象似乎很昂贵......
有什么想法吗?
答案 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
参数的类型。