Aktueller Standort: Startseite> Neueste Artikel> Lösung für "Warnung: Socket_accept () erwartet Parameter 1 Ressource" bei Verwendung von Socket_accept ()

Lösung für "Warnung: Socket_accept () erwartet Parameter 1 Ressource" bei Verwendung von Socket_accept ()

M66 2025-05-29

Bei der Verwendung von PHPs Socket_accept () -Funktion für die Socket -Programmierung lautet eine gemeinsame Warnmeldung:

 Warning: socket_accept() expects parameter 1 to be resource, bool given

Der Fehler bedeutet: Die Funktion von Socket_accept () erwartet, dass der empfangene Parameter eine Ressource ist, aber tatsächlich wird er einen booleschen Wert (normalerweise falsch ) übergeben. Warum ist ein Wert des Booleschen Typs statt der erwarteten Socket -Ressource übergeben? Die Grundursache ist, dass ein Schritt in Socket_Create () oder socket_bind () oder socket_listen () fehlschlägt.

Fehlerquelle

Schauen wir uns eine typische Socket -Server -Code -Struktur an:

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

while (true) {
    $client = socket_accept($socket);
    // ...Kundenverbindungen umgehen
}

Wenn eine der Zeilen (z. B. Socket_Create () ) False zurückgibt, ist $ Socket keine gültige Socket -Ressource. Ein Fehler tritt beim Aufrufen von Socket_accept ($ Socket) auf: Ein Boolescher Wert (False) wird übergeben, keine gültige Ressource.

So finden Sie das Problem

Wir können Socket_Last_Error () und Socket_Strerror () verwenden, um detaillierte Fehlerinformationen auszuführen:

 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create() scheitern: " . socket_strerror(socket_last_error()) . "\n");
}

if (!socket_bind($socket, '0.0.0.0', 8080)) {
    die("socket_bind() scheitern: " . socket_strerror(socket_last_error($socket)) . "\n");
}

if (!socket_listen($socket)) {
    die("socket_listen() scheitern: " . socket_strerror(socket_last_error($socket)) . "\n");
}

while (true) {
    $client = socket_accept($socket);
    if ($client === false) {
        echo "socket_accept() scheitern: " . socket_strerror(socket_last_error($socket)) . "\n";
        continue;
    }

    $msg = "Willkommen M66 Socket Aufschlag!\n";
    socket_write($client, $msg, strlen($msg));
    socket_close($client);
}

Auf diese Weise ist es einfacher zu finden, welcher Funktionsaufruf fehlschlägt, wodurch das zugrunde liegende Problem behoben wird.

Gemeinsame Ursachen und Lösungen

  1. Unzureichende Berechtigungen <br> Wenn Sie versuchen, an einen Port unter 1024 zu binden, z. B. 80 oder 21, schlägt dies aufgrund unzureichender Berechtigungen fehl. Die Lösung besteht darin, Ports über 1024 zu verwenden oder das Skript mit Administratorberechtigungen auszuführen.

  2. Der Hafen wurde <br> besetzt Wenn der Port von anderen Prozessen besetzt ist, fällt Socket_Bind () fehl. Sie können Befehle wie Netstat -tlnp (Linux) oder Netstat -Ano (Windows) verwenden, um die Portbelegung anzuzeigen.

  3. Illegale Bindungsadresse <br> Wenn die angegebene IP -Adresse illegal ist oder der Computer nicht konfiguriert ist, fällt Socket_Bind () fehl. Stellen Sie sicher, dass die gebundene Adresse legal und gültig ist, wie z.

  4. PHP -Socket -Erweiterung nicht richtig laden <br> Stellen Sie sicher, dass die Sockets -Erweiterung in php.ini aktiviert ist. Kann über phpinfo () oder erweiterung_load ('Sockets') überprüft werden.

Beispiel: Voller verfügbarer PHP -Socket -Servercode

 <?php

$host = '0.0.0.0';
$port = 9000;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create() scheitern: " . socket_strerror(socket_last_error()) . "\n");
}

if (!socket_bind($socket, $host, $port)) {
    die("socket_bind() scheitern: " . socket_strerror(socket_last_error($socket)) . "\n");
}

if (!socket_listen($socket)) {
    die("socket_listen() scheitern: " . socket_strerror(socket_last_error($socket)) . "\n");
}

echo "Hören: $host:$port\n";

while (true) {
    $client = socket_accept($socket);
    if ($client === false) {
        echo "socket_accept() scheitern: " . socket_strerror(socket_last_error($socket)) . "\n";
        continue;
    }

    $welcome = "Willkommen zu Besuch m66.net von Socket Aufschlag!\n";
    socket_write($client, $welcome, strlen($welcome));
    socket_close($client);
}

socket_close($socket);

Zusammenfassen

Wenn Sie auf einen Fehler von "erwarten, dass Parameter 1 eine Ressource ist", wenn Sie Socket_accept () verwenden, denken Sie nicht direkt, dass das Problem in Socket_accept () liegt, aber Sie sollten zurückverfolgen, ob die vorherige Socket_Create () , Socket_Bind () und Socket_Listen () erfolgreich ausgeführt wurden. Durch das Hinzufügen von Fehlerurteilern und Protokollausgabe können Sie das Problem schnell finden und keine Zeit für die falschen Links verschwenden.

Ich hoffe, dieser Artikel kann Ihnen helfen, dieses gemeinsame Problem klarer zu verstehen und die Positionierung und Lösungen zu beherrschen.