Aktueller Standort: Startseite> Neueste Artikel> Verwenden Sie Strace oder Netstat, um Probleme mit Socket_accept () Hörstatusproblemen zu beheben

Verwenden Sie Strace oder Netstat, um Probleme mit Socket_accept () Hörstatusproblemen zu beheben

M66 2025-06-03

Beim Schreiben von Socket-basierten Serveranwendungen mit PHP ist Socket_accept () eine Schlüsselfunktion zum Empfangen von Client-Verbindungen. In einigen Szenarien erhält Socket_accept () die Verbindung möglicherweise nicht normal, selbst wenn die Programmlogik korrekt ist. In diesem Artikel wird erläutert, wie Sie Strace und NetStat -Tools verwenden, um dieses Problem schnell zu lokalisieren und zu lösen.

1. Voraussetzung: Ein typisches Beispiel für PHP -Socket -Server

Das Folgende ist ein einfaches PHP -Serverprogramm, das auf Port 8080 hört:

 <?php
$host = '0.0.0.0';
$port = 8080;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $host, $port);
socket_listen($socket);

echo "Server listening on $host:$port\n";

while (true) {
    $client = socket_accept($socket);
    if ($client === false) {
        echo "Failed to accept connection\n";
        continue;
    }

    $msg = "Hello from server\n";
    socket_write($client, $msg, strlen($msg));
    socket_close($client);
}
?>

Wenn Sie Socket_accept () feststellen oder immer falsch zurückgeben, müssen Sie Systemwerkzeuge verwenden, um eine eingehende Fehlerbehebung durchzuführen.

2. Verwenden Sie Strace, um Systemaufrufe zu verfolgen

Strace ist ein System -Call -Tracking -Tool unter Linux. Sie können direkt anzeigen, welche Systemfunktionen von PHP -Skripten zur Laufzeit und deren Ausführungsergebnissen aufgerufen werden.

Schritt:

  1. Finden Sie die PHP -Prozesspid, die ausgeführt wird, z. B. unter Verwendung von PS :

     ps aux | grep php
    
  2. Verwenden Sie Strace , um an den Prozess zu binden:

     strace -p <PID> -e trace=network
    
  3. Beachten Sie, ob das folgende Verhalten in der Ausgabe vorhanden ist:

    • Akzeptieren (...) = -1 : Systemaufruf fehlgeschlagen, normalerweise begleitet von Fehlercodes (wie Eagain , Econnaborted usw.)

    • Hören Sie (...) an oder binden Sie (...) Fehler: Kann bedeuten, dass der Port besetzt ist oder die Berechtigungen nicht ausreichend sind

    • Kein Anruf zu akzeptieren () : Das Programm kann an anderer Stelle stecken bleiben

Wenn Strace zeigt, dass Accept () normal ist, aber dennoch keinen Verbindungszugriff hat, kann das Problem in der Netzwerkschicht oder in der Firewall liegen.

3. Verwenden Sie Netstat oder SS, um den Hörstatus zu bestätigen

Netstat und SS können verwendet werden, um zu prüfen, ob sich der Port im Hörzustand befindet und ob eine Verbindung hergestellt wird.

Überprüfen Sie den Hörstatus:

 netstat -tlnp | grep :8080

oder:

 ss -tlnp | grep :8080

Sie sollten in der Lage sein, Ausgänge ähnlich wie folgt zu sehen:

 tcp    LISTEN     0      128    0.0.0.0:8080    0.0.0.0:*     users:(("php",pid=12345,fd=3))
  • Wenn es kein Hören gibt, schlägt Socket_Bind () oder Socket_Listen () fehl;

  • Wenn das Zuhören normal ist, aber keine Verbindung besteht, kann der Kunde die Verbindung nicht initiiert oder von der Firewall abgefangen.

  • Wenn der Status Close_wait oder time_wait ist, bedeutet dies, dass der Verbindungslebenszyklus ungewöhnlich endet.

4. Weitere Debugging -Vorschläge

  1. Überprüfen Sie die Fehlermeldung <br> Verwenden Sie nach jedem Socket -Aufruf Socket_Strerror (socket_last_error ()) , um die spezifischen Fehlerinformationen anzuzeigen.

  2. Firewall- oder Selinux -Einschränkungen <br> Verwenden Sie Iptables oder Firewalld, um zu bestätigen, dass der 8080 -Port nicht blockiert ist.

  3. Der Hafen wird von anderen Programmen besetzt <br> Verwenden Sie LSOF -i: 8080, um zu überprüfen, ob andere Programme den Hafen besetzen.