Bei der Programmierung von Socket mit PHP ist Socket_accept () eine Schlüsselfunktion, die eine Client -Verbindung akzeptiert, die mit dem Hörbuchsen verbunden wurde. Während der tatsächlichen Entwicklung können Sie jedoch auf Situationen stoßen, in denen Socket_accept () keine Verbindungen empfangen kann. Diese Art von Problem ist oft verwirrend. In diesem Artikel werden fünf häufige Ursachen von Fehlern aufgeführt und entsprechende Lösungen bereitgestellt, mit denen Sie Probleme schnell lokalisieren und lösen können.
Problembeschreibung:
Nach dem Erstellen des Socket und der Bindung der Adresse wird der Socket, wenn Socket_Listen () nicht aufgerufen wird, nicht nach Verbindungsanforderungen an das Hören, und Socket_accept () wird niemals erfolgreich sein.
Lösung:
Rufen Sie sicher, dass Sie Socket_Listen () aufrufen, bevor Sie Socket_accept () aufrufen:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 12345);
socket_listen($socket); // essentiell
$client = socket_accept($socket);
Problembeschreibung:
Wenn der von Ihnen gebundene Port von anderen Programmen besetzt ist, fällt Socket_Bind () fehl, was in allen nachfolgenden Operationen, einschließlich Socket_accept () , Fehler verursacht.
Lösung:
Um zu überprüfen, ob der Port besetzt ist, können Sie Befehle wie netstat -tlnp | verwenden Grep 12345 . Überprüfen Sie auch den Rückgabewert von Socket_Bind () und verwenden Sie Socket_Last_error (), um die Fehlermeldung zu erhalten:
if (!socket_bind($socket, '0.0.0.0', 12345)) {
echo "Bindung fehlgeschlagen: " . socket_strerror(socket_last_error($socket));
exit;
}
Problembeschreibung:
Wenn der Server auf die Verbindung wartet, versucht der Client überhaupt nicht, eine Verbindung herzustellen, oder stellt eine Verbindung zu der falschen Adresse und dem falschen Port her, sodass er nicht socket_accept () auslösen kann.
Lösung:
Bestätigen Sie, ob die Verbindungsadresse und den Port des Kunden korrekt sind, zum Beispiel:
$client = stream_socket_client("tcp://m66.net:12345", $errno, $errstr, 30);
Sie können auch telnet m66.net 12345 verwenden, um manuell zu testen, ob die Verbindung erfolgreich sein kann.
Problembeschreibung:
Socket_accept () ist eine Blockierungsfunktion, die darauf wartet, wenn keine Client -Verbindung besteht. Dies kann das Programm so aussehen lassen, als wäre es fest.
Lösung:
Sie können Socket_Set_Nonblock () verwenden, um den Hörbuchsen auf den nicht blockierenden Modus festzulegen, oder mit Socket_Select () Timeout-Warten implementieren:
socket_set_nonblock($socket);
$client = @socket_accept($socket);
if ($client === false) {
echo "Derzeit keine Verbindungsanfrage\n";
}
oder:
$read = [$socket];
$write = $except = [];
if (socket_select($read, $write, $except, 5) > 0) {
$client = socket_accept($socket);
}
Problembeschreibung:
Obwohl der Server -Hörport korrekt festgelegt ist, verhindert die Firewall -Regeln des Betriebssystems oder die Sicherheitsgruppenrichtlinie des Cloud -Servers Clientverbindungsanforderungen.
Lösung:
Überprüfen und öffnen Sie den Port des Servers. Wenn Sie beispielsweise Iptables oder Firewalld unter Linux verwenden, können Sie den Zugriff auf Port 12345 oder das Öffnen der entsprechenden Ports in Cloud -Service -Plattformen wie AWS und Alibaba Cloud eröffnen.