boost::asio::placeholders::bytes_transferred
在async_read_until()
中的含义是什么?在回调函数中,它返回的值比streambuf.size()
小。streambuf
在回调之前是安全的。总之,.bytes_transferred
不是通过套接字的实际字节数,而是较少的字节数。我是误解了这一切,还是什么?
编辑:--我从套接字中读取了以下协议:
Y43,72,0,,91009802000000603=0000000000000000000
"Y43,"
-是标题。
"Y"
-是消息类型。
"43"
-需要读取的额外字节
","
-定界符头是直到第一个",“遇到。
我的代码是用来阅读的就像:
void handle_write(const boost::system::error_code& error,
size_t bytes_transferred)
{
if (!error)
{
boost::asio::async_read_until(
socket_,
inputStreamBuffer_,
',',
boost::bind(
&client::handle_read1, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred
)
);
}
else
{
std::cout << "Write failed: " << error << "\n";
}
}
void handle_read1(const boost::system::error_code& error,
size_t bytes_transferred)
{
cout << "bytes_transferred=" << bytes_transferred << endl;
if (!error)
{
cout << "0 size=" << inputStreamBuffer_.size() << endl;
istream is(&inputStreamBuffer_);
char c[1000];
is.read(c,bytes_transferred);
c[bytes_transferred]=0;
for (int i=0;i<bytes_transferred;++i)
{
cout << dec << "c[" << i << "]=" << c[i] << " hex=" << hex << static_cast<int>(c[i]) << "#" << endl;
}
}
else
{
std::cout << "Read failed: " << error << "\n";
}
}
从另一边发送的溪流:
Y43,71,0,,91009802000000595=0000000000000000000
有时,我读到:
bytes_transferred=4
0 size=47
c[0]=Y hex=59#
c[1]=4 hex=34#
c[2]=3 hex=33#
c[3]=, hex=2c#
从另一边发送的溪流:
Y43,72,0,,91009802000000603=0000000000000000000
但其他时候,我读到:
bytes_transferred=7
0 size=47
c[0]= hex=0#
c[1]= hex=0#
c[2]= hex=0#
c[3]= hex=0#
c[4]=7 hex=37#
c[5]=2 hex=32#
c[6]=, hex=2c#
套接字使用SSL进行保护,客户机和服务器应用程序是boost_asio/example/ssl/*中略有修改的示例。
在第二个示例中,我松开了整个头:(
发布于 2011-06-21 15:24:13
解决了。当从服务器发送回复时,我将std::string
对象传递给boost::asio::buffer()
,而不是std::string.c_str()
。
发布于 2011-06-20 13:28:38
函数有四个重载,但让我们假设使用了第一个重载。如果您查看文档,那么您将看到bytes_transferred
是指定的分隔符的字节数和包含字节数。
此外:
在成功的async_read_until操作之后,streambuf可能包含分隔符以外的其他数据。应用程序通常会将该数据保留在streambuf中,以供后续的async_read_until操作检查。
发布于 2011-06-20 19:26:41
正如文档所建议的那样,您应该能够忽略bytes_transferred
以外的任何内容,只需再次调用async_read_until
即可。
但是,如果您碰巧在ASIO 1.5.3中使用全新的SSL实现(这还不是boost的正式组成部分),您可能会遇到与我一样的问题(为此我提交了一个修补程序):
http://comments.gmane.org/gmane.comp.lib.boost.asio.user/4803
看起来您并不是在使用新版本或遇到相同的问题,但是如果遇到了一些限制,并且受到了新实现的好处的诱惑,那么应该注意:
新的实现编译速度更快,性能明显提高,并支持自定义内存分配和处理程序调用。它包括新的API特性,如证书验证回调,并改进了错误报告。在大多数情况下,新的实现是与旧的兼容的。
https://stackoverflow.com/questions/6411740
复制相似问题