Cześć. Mam dziwny problem z funkcją async_read_some
, którą wywołuję przez timer co zadany czas.
Problem polega na tym, że funkcja odpiera pierwszą ramkę z serwera a następnie resztę z przerwą ok 10 sekund. Co jest bardzo dziwne, gdyż ramki wychodzą po sobie z serwera (sprawdziłem wiresharkiem).
Kolejny problem to że _bytesReadable
jest inne niż bytesTransferred
.
Pomożecie?
Boost version: 1.77
output:
readHandle bytesReadable: 0 bytesTransferred: 1112
pseudokod:
class TlsSocket
{
public:
TlsSocket(boost::asio::io_context &io_context,
const std::string &endpoint);
private:
boost::asio::io_context &_iocontext;
boost::asio::ssl::context _ctx;
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> _socket;
std::vector<uint8_t> _recvBuffer;
std::vector<uint8_t> _sendBuffer;
size_t _bytesReadable{0};
}
void TlsSocket::readHandle(const boost::system::error_code &ec, std::size_t bytesTransferred)
{
if(_bytesReadable == 0 && bytesTransferred > 0)
{
std::cout << "readHandle ERROR bytesReadable: " << _bytesReadable
<< " bytesTransferred: " << bytesTransferred << std::endl;
return;
}
/// .. any code
}
void TlsSocket::receiveAsyncWithTimeout()
{
boost::asio::socket_base::bytes_readable command(true);
_socket.lowest_layer().io_control(command);
_bytesReadable = command.get();
_socket.async_read_some(boost::asio::buffer(_recvBuffer),
boost::bind(&TlsSocket::readHandle,
this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}