Frage

So

Ich habe mit den Boost-Asio-Funktionen und Buchsen (speziell das Asynchron-Lese- / Schreib) herum spielen. Nun, dachte ich, dass boost::asio::async_read nur die Handler aufgerufen, wenn ein neuer Puffer in der Netzwerkverbindung kommt ... aber es nicht stoppt die gleichen Puffer zu lesen und hält somit den Handler aufruft. Ich habe in der Lage gewesen, es zu mildern, indem die Anzahl der übertragenen Bytes überprüft, aber es ist im Grunde in einer belebten-Warteschleife verschwenden CPU-Zyklen.

Hier ist, was ich habe:

class tcp_connection : : public boost::enable_shared_from_this<tcp_connection> 
{
public:
    // other functions here

    void start()
    {
    boost::asio::async_read(socket_, boost::asio::buffer(buf, TERRAINPACKETSIZE),
        boost::bind(&tcp_connection::handle_read, shared_from_this(),
          boost::asio::placeholders::error,
          boost::asio::placeholders::bytes_transferred));
    }

private:
    const unsigned int TERRAINPACKETSIZE = 128;
    char buf[TERRAINPACKETSIZE];


    void handle_read(const boost::system::error_code& error, size_t bytesT)
    {
        if (bytesT > 0)
        { 
             // Do the packet handling stuff here
        }

        boost::asio::async_read(socket_, boost::asio::buffer(buf, TERRAINPACKETSIZE),
        boost::bind(&tcp_connection::handle_read, shared_from_this(),
          boost::asio::placeholders::error,
          boost::asio::placeholders::bytes_transferred));
    }
};

werden einige Sachen ausgeschnitten, aber im Grunde eine neue Verbindung erstellt wird, dann wird start() genannt. Gibt es etwas, was ich bin fehlt, so dass die handle_read Verfahren nicht kontinuierlich genannt bekommt?

War es hilfreich?

Lösung

Eine wilde Vermutung: Kontrollieren Sie, error in handle_read? Wenn der Socket in einem Fehlerzustand aus irgendeinem Grunde ist, ich denke, dass der verschachtelte Anruf von async_read gemacht handle_read sofort „vollständig“, in einer sofortigen Aufforderung handle_read

Andere Tipps

Ich habe das gleiche Problem. In meinem Fall, ich las in einem std :: vector wie folgt aus:

boost::asio::async_read(socket_,
st::asio::buffer(*message,message->size()),
            boost::bind(
              &ActiveSocketServerSession::handleFixLengthRead,
              shared_from_this(),
              boost::asio::placeholders::error,
              boost::asio::placeholders::bytes_transferred)
    );

Ich habe einen anpassungsfähigen Vektor für eine Variante Anzahl von Bytes akzeptieren

    std::vector<unsigned char>* message;
message = new std::vector<unsigned char> (sizePacket);

Als ich das erste Paket empfing alles gut ging, aber nach dem ersten, hört nie ohne Daten Entriegeln handle_reader.

Meine Lösung war mein Vektor und alloc Raum löschen wieder, nachdem es die Verarbeitung:

void ActiveSocketServerSession::handleFixLengthRead(    const         boost::system::error_code& error,
                                                    std::size_t bytes_transferred){

    --> processing your data (save to another site)
--> delete message;
--> message = new std::vector<unsigned char> (sizePacket);

//starting to read again
boost::asio::async_read(socket_,
                boost::asio::buffer(*message,message->size()),
            boost::bind(
              &ActiveSocketServerSession::handleFixLengthRead,
              shared_from_this(),
              boost::asio::placeholders::error,
              boost::asio::placeholders::bytes_transferred)
);

    }else{
        logMessage.str("");
        logMessage << "Error handling data id: "<<getId()<< "from port";
    }
}

Ich fand diese Lösung zu lesen diese

Nachdem er diese beiden Zeilen geht alles in Ordnung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top