Frage

Ich habe den Boost Asio Referenz lesen, durch das Tutorial gegangen und sah einige Beispiele an. Aber ich bin nicht in der Lage zu sehen, wie ein Sockel abgerissen werden sollte:

  1. Soll ich anrufen close () oder dies durch den Anschluss des destructor getan wird?
  2. Wann sollte ich anrufen shutdown ()
  3. Was sind die Auswirkungen der shutdown ()? Ich bin mir bewusst, dass es „Deaktiviert sendet oder empfängt“, aber wie wird das gemacht? Was kann ich erwarten, wenn ich mit der Buchse senden oder empfangen, nachdem es deaktiviert wurde?
  4. Welche Fehler kann ich von close ()
  5. erwarten
War es hilfreich?

Lösung

Da es sich um eine Multi-Frage, ich werde mein Bestes tun, um jeden Teil zu Ihrer Zufriedenheit zu beantworten:

1) Es ist meine Erfahrung mit ASIO-Buchsen gewesen, dass der destructor den Sockel Griffe schließen. Allerdings habe ich nur mit TCP-Sockets behandelt. Der beste Weg, dies zu überprüfen ist, einfach auf dem Code zu suchen, den destructor, um zu sehen, ob es etwas tut, das ein enges ähnelt. Ich weiß, dass Code-Boost ein wenig schwierig sein kann, durch zu gehen, so könnte es am einfachsten, einfach ein wenig Beispielprogramm zu erstellen, die eine UDP-Socket öffnet und selbst zerstören es dann. Auf diese Weise können durch den Code in einem Debugger Schritt kann die Logik folgen.

Da die Designer Boost dies für TCP-Sockets berücksichtige, ich habe eine harte Zeit, sich vorzustellen, sie würden das gleiche für UDP-Sockets nicht.

2) Anruf shutdown() nur, wenn Sie das Gefühl, es ist notwendig, einen Code zu verhindern, dass eine Zukunft recv und / oder send auf dem Sockel durchführt. Es ist normalerweise nicht erforderlich, obwohl ich es auf TCP-Sockets verwendet gesehen habe die Steckdose zu zwingen, eine RST zu senden, wenn es geschlossen ist (im Gegensatz zu dem Standard „Graceful“ shutdown Gegensatz wo ausstehenden verarbeitet Sends).

3) Sie können ein zweikanaliger Form der Kommunikation von Steckdosen denken als: eine für das Lesen, das andere für das Senden. Sie können entweder eine Abschaltung unabhängig von dem anderen, und Sie können weiterhin einen Kanal verwenden, wenn der andere abgeschaltet wird (das heißt Sie noch nach dem Abschalten für Sende- und umgekehrt empfangen kann). eine Buchse Schließen ist identisch Abschaltung sowohl recv zu rufen und senden.

Ausschalten für recv unten einfach verhindert, dass Ihr Code aus keinen weiteren Daten zu lesen. Wenn Sie dies versuchen, erhalten Sie einen Socket-Fehler erhalten. Ebenso, wenn die andere Seite der Verbindung versucht, Daten zu senden Sie, es wird eine Fehlermeldung (sorry wieder auf TCP Welt zu wechseln, aber ich glaube, ein RST an den Absender bekommt antwortet zurück).

Ausschalten für herabs ebenfalls verhindert, dass Ihr Code aus keinen weiteren Daten zu senden. Wenn ich mich recht erinnert, sieht das identisch zu dem, was passiert, wenn Sie eine Steckdose in der Nähe (ein Null-Länge Paket wird über geschickt, um die andere Seite zu signalisieren, dass der jeweilige Kanal stillgelegt wurde). Jeder zukünftige versucht wird zu senden einen Fehler zurück.

4) Sie müssen Ihre Dokumente überprüfen, sicher zu wissen. MSDN wird gibt eine ziemlich gute Indikation, obwohl ich nicht weiß, dass ich es maßgebend sein betrachten würde.

Andere Tipps

Aus den Beispielen auf Boost-Website gegeben, so scheint es, als ob Sie einfach schließen verwenden sollen (). Zum Beispiel, schauen Sie sich diese:

void connection::stop()
{
  socket_.close();
}

von dieser Adresse Genommen: HTTP Server

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