boost::asio::placeholders::bytes_transferred
在async_read_until()
中是什麼意思?在回調函數中,它會返回比streambuf.size()
更小的值。在回調之前,streambuf
已經清楚。綜上所述,... bytes_transferred
不是實際通過套接字的字節數,而是更少。我是否誤解了所有這些,或者是什麼?boost :: asio ::佔位符:: 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 /示例/ SSL/*例子。
在第二個例子中,我失去了整個頭部:(
感謝您的回覆,但我認爲我遇到了其他問題。 有時,直到第一個分隔符爲止的緩衝區內容被清零,所以我有效地丟失了數據包的標題。不過,這是隨機行爲。 –