2017-08-10 4 views
1

Ich möchte den Durchsatz meines udp Gameservers, der Boost ASIO verwendet, erhöhen. Jetzt, jedes Mal, wenn ich ein Paket senden muss, stelle ich es in eine Warteschlange, dann prüfen, ob es eine ausstehende Operation async_send_to gibt, wenn ja, nichts tun, wenn nicht, async_send_to aufrufen. Dann warte ich auf den write handler, der aufgerufen wird, und rufe dann async_send_to für das nächste Paket in der Warteschlange auf, falls vorhanden.Multiple Boost :: ASIO async_send_to auf einmal

Die Dokumentation sagt, dass es die Art ist, es "für TCP-Socket" zu tun, aber es gibt NICHTS im ganzen Internet über UDP-Socket. Versuchen Sie es, suchen Sie es auf stackoverflow, Sie werden sehen, niemand spricht darüber, und für die 2 Fragen, die Sie finden, wird die Frage von Benutzern ignoriert.

Warum wird es geheim gehalten? Und für die 1 Million Dollar Frage, kann ich sicher async_send_to mehrere Male hintereinander aufrufen OHNE zu warten, bis der Schreib-Handler aufgerufen wird?

Vielen Dank im Voraus.

Antwort

1

Diese Logik ist für das UDP-Protokoll bedeutungslos, da sie den Sendevorgang nicht blockieren muss. Ein Datagramm wird entweder geliefert oder verloren. UDP muss es nicht im Ausgabepuffer speichern und unbegrenzt viele Male erneut senden, bis es ein ACK-Paket erhält.

+0

So um sicher zu gehen, kann ich alle async_send_to hintereinander aufrufen, ohne darauf warten zu müssen, dass der write-handler aufgerufen wird, wobei natürlich der puffer bis zum handler-Aufruf gültig bleibt? – NoobyLearner

1

Nein, Sie können async_send_to nicht mehrmals hintereinander anrufen, OHNE dass Sie warten müssen, bis der Schreib-Handler aufgerufen wird. Siehe Asynchronous IO with Boost.Asio, um genau zu sehen, warum.

unterstützt jedoch asioscatter gather und so können Sie async_send_to mit mehreren Puffern nennen, zB:

typedef std::deque<boost::asio::const_buffer> ConstBuffers; 

std::string msg_1("Blah"); 
... 
std::string msg_n("Blah"); 

ConstBuffers buffers; 
buffers.push_back(msg_1); 
... 
buffers.push_back(msg_n); 

socket_.async_send_to(buffers, tx_endpoint_, write_handler); 

So können Sie Ihren Durchsatz erhöhen, indem double buffering Ihre Nachrichtenwarteschlange und gesammelt unter Verwendung schreibt ...

+0

Liefert Scatter sammeln alle Puffer als ein einzelnes Datagramm? – sehe

+1

Das hängt davon ab, wie viele Daten Sie übertragen müssen, wie groß Ihr Ethernet-Frame usw. ist, aber es wird versuchen, sein Möglichstes zu tun, um es in so wenige Datagramme wie möglich einzufügen. –