Erhöhung Asio async_read Lesen nicht aufhören?
-
08-07-2019 - |
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?
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.