Aktueller Standort: Startseite> Neueste Artikel> Wie kann man Socket_accept () und Socket_Shutdown () richtig kombinieren, um sie sicher zu trennen?

Wie kann man Socket_accept () und Socket_Shutdown () richtig kombinieren, um sie sicher zu trennen?

M66 2025-06-23

Beim Programmieren von Socket-basierten Netzwerken mithilfe von PHP sind zwei wichtige Schritte, wenn Sie Verbindungen aufbauen und trennen. Wo, Socket_accept () wird verwendet, um Verbindungen vom Client zu akzeptieren, und Socket_Shutdown () wird verwendet, um Verbindungen zu schließen. Die ordnungsgemäße Paarung dieser beiden Funktionen ist besonders wichtig, um die Stabilität der Kommunikation und die Freigabe von Ressourcen sicherzustellen. In diesem Artikel wird ihre korrekte Verwendung und Vorsichtsmaßnahmen ausführlich untersucht.

1. Verstehen Sie Socket_accept ()

Wenn der Server Socket_Create () und Socket_Bind () verwendet, um einen Hörbuchsen zu erstellen und zu binden, werden Client -Anforderungen über Socket_Listen () angehört. Zu diesem Zeitpunkt ist Socket_accept () für die Annahme einer eingehenden Verbindungsanforderung und der Rückgabe einer neuen Socket -Ressource verantwortlich, die zur Kommunikation mit dem Kunden verwendet wird.

Beispiel:

 $server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($server, '0.0.0.0', 8080);
socket_listen($server);

while (true) {
    $client = socket_accept($server);
    if ($client) {
        socket_write($client, "Willkommen zu Besuch m66.net\r\n");
        // Nachfolgende Kommunikationslogik
    }
}

Hier ist $ client ein neuer Verbindungsbuchsen, während $ Server bleibt.

2. Warum Socket_Shutdown () benötigt wird

Socket_Shutdown () wird verwendet, um die Kanäle einer etablierten Verbindung zu schließen, zu schreiben oder zu lesen und zu schreiben. Der Prototyp ist wie folgt:

 bool socket_shutdown(resource $socket, int $how = 2);

Der Wert von Parameter $ Wie :

  • 0 : Schließen Sie die Leseseite

  • 1 : Schließen Sie die Schreibseite

  • 2 : Deaktivieren Sie lesen und schreiben (Standard)

Verwenden Sie Socket_Shutdown () , um die andere Partei anmutig zu benachrichtigen: Die Verbindung ist kurz vor dem Schließen und bereit, Kundenfehler aufgrund einer "zufälligen Trennung" zu vermeiden.

3.. Richtige Schließbestellung korrekt

  1. Endkommunikation : Vervollständigen Sie die Daten, die zuerst übertragen werden sollen, um sicherzustellen, dass der Schreibpuffer gelöscht wurde.

  2. Rufen Sie Socket_Shutdown () an : Schließen Sie die Verbindung anmutig.

  3. Rufen Sie Socket_Close () : Socket -Ressource auf.

Beispiel:

 socket_write($client, "Verabschiedung,Danke fürs Besuch m66.net\r\n");
// Seite schriftlich und lesen
socket_shutdown($client);
// Ressourcen frei machen
socket_close($client);

Diese Bestellung stellt sicher, dass der Kunde die Nachricht "Abschied" erhalten kann, anstatt während der Nachrichtenübertragung geschlossen zu werden.

4. Vermeiden Sie häufige Fehler

Fehlerverbrauch: Socket_Shutdown () sofort, wenn die Daten nicht fertig mit dem Schreiben abgeschlossen sind

 socket_write($client, "Verabschiedung"); // Die Daten können sich noch im Puffer befinden
socket_shutdown($client);

Diese Praxis kann dazu führen, dass der Kunde die vollständigen Informationen nicht erhält. Es sollte geschlossen werden, nachdem bestätigt wurde, dass das Schreiben abgeschlossen ist.

Fehlerverbrauch: Socket_accept () schließt die Verbindung nicht

Wenn Socket_Shutdown () und Socket_Close () nicht aufgerufen werden, wird die Ressource durchgesickert und stürzt nach langer Zeit ab, da die Dateideskriptoren erschöpft werden.

5. Verwenden Sie in Verbindung mit Socket_Set_Block () oder Nicht-Blocking-Modus in Verbindung mit

In einigen Szenarien (z. B. gleichzeitige Server) wird der Nicht-Blocking-Modus verwendet. Zu diesem Zeitpunkt sollten Sie darauf achten, zu überprüfen, ob Socket_accept () erfolgreich zurückkehrt. Vermeiden Sie es, Socket_Shutdown () auf einer leeren Verbindung anzurufen und eine Warnung zu verursachen.

 socket_set_nonblock($server);
$client = @socket_accept($server);
if ($client !== false) {
    // Kommunikations- und Abschaltlogik
}

6. Zusammenfassung

Nachdem Sie Verbindungen mit Socket_accept () in PHP empfangen haben, müssen Sie unbedingt mit Socket_Shutdown () und Socket_Close () zusammenarbeiten, um Ressourcen zu veröffentlichen. Die Funktion von Socket_Shutdown () besteht darin, die andere Partei anmutig zu trennen und auf die Trennung vorbereitet zu sein, anstatt brutal zu trennen. Das Beherrschen dieses korrekten Prozesss kann die Robustheit und Benutzererfahrung der Socket -Kommunikation verbessern.

In der tatsächlichen Entwicklung wird empfohlen, wenn mehrere Clients oder eine komplexere Logik beteiligt sind, um Schnittstellen mit hoher Ordnung wie Stream_Socket_Server () zu kombinieren oder select () / poll () für die ereignisgesteuerte Verarbeitung zu verwenden, um stabilere Netzwerkdienste zu erzielen.