Boost ASIO - problem z async_read_some

0

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));
}

0
hns napisał(a):

Cześć. Mam dziwny problem z funkcją async_read_some, którą wywołuję przez timer co zadany czas.

Po co ten timer? Po wywoałanu async_read_some masz gwarancje, że callback zostanie wywołany, gdy socket będzie miał jakieś dane, albo gdy nastąpi jakiś bląd.
Ważne tylko, by kontrola przepływu wróciła do boost::asio::io_context (event loop).

0
MarekR22 napisał(a):
hns napisał(a):

Cześć. Mam dziwny problem z funkcją async_read_some, którą wywołuję przez timer co zadany czas.

Po co ten timer? Po wywoałanu async_read_some masz gwarancje, że callback zostanie wywołany, gdy socket będzie miał jakieś dane, albo gdy nastąpi jakiś bląd.
Ważne tylko, by kontrola przepływu wróciła do boost::asio::io_context (event loop).

Żeby cyklicznie wykonywać odczyt np. co 1 milisekundę.

0

Czy ty chcesz stawiać opór na nadawcę danych? (W TCP jest to możliwe).

0
MarekR22 napisał(a):

Czy ty chcesz stawiać opór na nadawcę danych? (W TCP jest to możliwe).

Nie rozumiem. Chcę odczytywać wszystko to co wyśle nadawca.

0

Problem rozwiązany. boost::asio::socket_base::bytes_readable powoduje blokowanie się async_read_some. Wyrzuciłem boost::asio::socket_base::bytes_readable i działa ok.

1 użytkowników online, w tym zalogowanych: 0, gości: 1