boost::asio::buffer: Immer die Größe des Puffers und Verhinderung von buffer-overflow?
Habe ich die beiden folgenden Funktionen zum senden und empfangen von Paketen.
void send(std::string protocol)
{
char *request=new char[protocol.size()+1];
request[protocol.size()] = 0;
memcpy(request,protocol.c_str(),protocol.size());
request_length = std::strlen(request);
boost::asio::write(s, boost::asio::buffer(request, request_length));
}
void receive()
{
char reply[max_length];
size_t reply_length = boost::asio::read(s, boost::asio::buffer(reply, request_length));
std::cout << "Reply is: ";
std::cout.write(reply, reply_length);
std::cout << "\n";
}
Die Fragen beziehen sich auf diesen Teil boost::asio::buffer(reply, request_length)
wo die Anfrage Länge ist die Länge einer Zeichenkette, die war zunächst im setup, wenn das Paket versendet wurde. Wie überprüfe ich die Größe des Puffers, ohne zu wissen request_length
? Eine andere Frage ist, wie kann ich verhindern, Pufferüberlauf?
InformationsquelleAutor pandoragami | 2013-02-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Um die Größe der Puffer, die
boost::asio::buffer_size()
- Funktion verwendet werden. Aber, in deinem Beispiel, dies wird höchstwahrscheinlich wenig nutzen für Sie.Wie bereits in den Puffer übersicht, Steigern.Asio-Puffer verwenden von Klassen zur Darstellung von Puffer. Diese Klassen stellen eine Abstraktion und schützen Steigern.Asio-Operationen gegen Pufferüberläufe. Obwohl das Ergebnis des
boost::asio::buffer()
übergeben Operationen, die meta-Daten, wie die Größe des Puffers oder des Ihr zugrunde liegenden Typ, ist nicht übermittelt. Auch diese Puffer nicht eigenen Speicher, so ist es die Anwendungen, die Verantwortung sicherzustellen, dass die zugrunde liegenden Speicher bleibt gültig während der Dauer der Puffer Abstraktion Lebensdauer.Den
boost::asio::buffer()
Funktion bietet eine komfortable Möglichkeit zum erstellen der buffer-Klassen, in denen die Größe des Puffers, die sich aus der Art möglich. Wenn Boost.Asio ist in der Lage, ableiten die Länge des Puffers, dann zu Steigern.Asio-Betrieb wird nicht auf einem buffer overflow bei der Verwendung des resultierenden Puffer-Typ. Jedoch, wenn die Anwendung code gibt die Größe des Puffersboost::asio::buffer()
ist, dann ist es die Anwendungen, die Verantwortung, um sicherzustellen, dass die Größe nicht größer ist als die der zugrunde liegende Speicher.Beim Lesen von Daten, einen Puffer erforderlich ist. Die grundlegende Frage auf, wie wird man wissen, wie viel Speicher zu reservieren, wenn Boost.Asio überträgt nicht die Größe. Es gibt ein paar Lösungen für dieses problem:
Abfrage der sockel für die Menge der verfügbaren Daten über
socket::available()
, dann reservieren Sie den Puffer entsprechend.Verwenden Sie eine Klasse, die Boost.Asio kann wachsen in Erinnerung, wie
boost::asio::streambuf
. Einige Operationen, wieboost::asio::read()
akzeptierenstreambuf
Objekte als Ihren Puffer und Speicher als erforderlich für den Betrieb. Jedoch, ein Abschluss-Bedingung bereitgestellt werden sollten; andernfalls wird der Vorgang fortgesetzt, bis der Puffer voll ist.Als Öö Tiib schlägt vor, übernehmen die Länge als Teil der Kommunikations-Protokoll. Überprüfen Sie die Boost.Asio Beispiele für Beispiele von Kommunikationsprotokollen. Fokus auf das Protokoll, nicht unbedingt auf den Boost.Asio API.
In eine variable-Länge-Protokoll, die Nachrichten sind oft in zwei Teile unterteilt: header und body. Der header ist normalerweise Feste Größe, und enthalten verschiedene meta-Informationen, wie die Länge des Körpers. Dies ermöglicht ein Leser zum Lesen eines headers zu einer festen Größe Puffer, extrahiert die Länge des Körpers ist, reserviert einen Puffer für den Körper, dann Lesen Sie die Körper.
boost::asio::streambuff
mitboost::asio::read_until()
funktionierte gut für mich in dem Fall, wo die Nachrichten enden mit einem Trennzeichen.InformationsquelleAutor Tanner Sansbury
In der Regel ein Kommunikations-Protokoll verwendet entweder fester Länge Nachrichten oder Nachrichten, die enthalten header, der sagt, die Länge der Nachricht.
Boost.Asio-online-Dokumentation enthält eine große Reihe von Beispielen und tutorials, so sollten Sie vielleicht von dort aus starten. Wikipedia ist eine gute Quelle für die Erklärung Datenübertragung Terminologie, boost asio-Dokumentation tut es nicht.
vielleicht ist der boost asio-Beispiele erwarten, dass die Menschen vertraut zu sein, die mit dem Begriff der digitalen Kommunikation und die Bedeutung der verwandten Begriffe wie protcols, clients, Server, Anfragen etc. das in Beispielen verwendet wird. Ich schlage vor, gegen reverse-engineering, solche Kenntnisse aus dem code, es gibt aber auch einfachere Quellen, um all das lernen.
Beispiele nicht erklären, was die API da, das dokumentiert ist in der Verweis - Bereich. Der Boost.Asio-Bibliothek ist Komplex, aber nicht kompliziert. Es gibt eine große Menge von Informationen in der Dokumentation, und es kann sich lohnen, sich die Zeit nehmen, sich damit vertraut zu machen, sich mit den verschiedenen teilen der Dokumentation.
vielen Dank, dass Referenz-link ist nützlich. Nie wusste, dass es existierte.
InformationsquelleAutor Öö Tiib
Ich denke, deine Frage ist verwirrend, aber das könnte helfen:
boost::asio::buffer(,)
gibt, was genau. Ich sehe, dass es etwas zurückgibt, in derba::read(s,buffer(,))
aber was ist es?Ein Typ, stellt den Speicher, aber nicht die Erinnerung. Funktion hilft bei der Anpassung häufigsten verwendeten Typen, so dass Sie entsprechen den Typ-Anforderungen für viele der Boost.Asio-Betrieb. übersicht bietet einige Informationen.
Sie müssen nicht zu Durchlaufen haben, max_length zu asio::buffer() in diesem Beispiel. (Da asio kann mittels
sizeof
.)InformationsquelleAutor perreal