2009-06-09 3 views
6

Ich habe versucht, das für den besseren Teil des Tages zu erreichen, ich würde wirklich jede Hilfe schätzen. Beide meiner Apps, der Client und der Server, haben begonnen, Ausnahmen vom "Vektor-Index außerhalb des Bereichs" zu werfen.Wie sende ich ein std :: vector <char> mit Boost :: Asio?

Wie macht man das Ding richtig?


Noch versucht, herauszufinden, wer?

Soweit ich ich soll undestand eine

boost::asio::basic_stream_socket stream; Und dann rufen erstellen:

stream.send(boost::asio::buffer(data));?

Ich nehme an, es ist vollkommen möglich, es asynchron zu tun? Was sind die Unterschiede zwischen: basic_stream_socket::send() vs basic_stream_socket::write_some() vs basic_stream_socket::async_write_some()?

basic_stream_socket::receive() vs. vs. basic_stream_socket::async_read_some()?

Ich gehe davon aus, dass send() & Methoden, die ich anrufen kann, wenn ich, dass 100% der Daten sicherstellen möchten, wird gesendet/empfangen - auf Kosten der Buchse blockiert?

Ich gehe davon aus, dass write_some() & read_some() Methoden, die ich anrufen kann, wenn ich nicht sicher, ob 100% der Daten bin/empfangen wird gesendet - während immer noch den Sockel blockiert?

Ich nehme an, dass async_read_some() & async_write_some() sind Methoden, die den Sockel nicht blockieren und sie lesen/schreiben, was auch immer sie können?

+3

können Sie etwas Code anzeigen? – Naveen

+0

Sie sollten dem Fragetext selbst oder in Form von Kommentaren weitere Informationen hinzufügen, anstatt Ihre eigene Frage mit Fragen zu beantworten. Wenn Sie alles von Grund auf einrichten müssen, stellen Sie bitte einen Kontext bereit (z. B. ein TCP-Socket, eine serielle RS-232-Schnittstelle usw.). –

+0

Gelöscht q "Nein, ich habe nicht - wie mache ich das?" - Ich bin mir nicht sicher, worauf es sich bezieht, aber es ist besser, die Frage zu aktualisieren (oder Kommentare zu hinterlassen, wenn Sie genügend Wiederholungen erhalten). –

Antwort

5

Sie Unter der Annahme erstellt einen Strom und versuchen, die vector<char>Daten senden:

stream.send(boost::asio::buffer(data)); 

Siehe boost:asio::buffer.

0

Ich bin ziemlich neu Asio zu steigern, aber hier meine Antworten sind:

Die Funktionen mit Funktionsnamen mit async_ Start nimmt unter anderem eine Callback-Funktion als Argument, die aufgerufen wird, wenn der Vorgang abgeschlossen ist. Das heißt, die Funktion async_write_some() blockiert nicht, sondern kehrt sofort zurück, und wenn die Operation beendet ist, wird die Callback-Funktion aufgerufen.

Ihre Annahmen sind richtig, soweit ich verstanden habe. Mit den Funktionen async_write_some usw. haben Sie jedoch eine Callback-Funktion, die die Anzahl der übertragenen Bytes als Argument übernimmt.

Zum Beispiel, hier habe ich eine Funktion, die von einem Socket liest:

boost::asio::async_read(
    *socket_, 
    boost::asio::buffer(read_msg_.body(), read_msg_.body_length()), 
    boost::bind(
     &sender::handle_read_content, 
     this, 
     boost::asio::placeholders::error, 
     boost::asio::placeholders::bytes_transferred 
    ) 
); 

Die Callback-Funktion in es handle_read_content, und es sieht wie folgt aus:

void sender::handle_read_content(
    const boost::system::error_code& err, 
    std::size_t bytes_transferred 
) 

Am Anfang habe ich Lesen Sie dieses Tutorial, das sehr gut war: Boost Asio

Verwandte Themen