Immer "Address already in use", wenn ich versuche, Sie zu binden, ein socket auf localhost in php
Ich versuche zum erstellen einer socket-Verbindung von einem php-script auf einem lokalen server (Qt, QLocalServer), aber ich habe Probleme beim erstellen einer Verbindung auf der php-Seite.
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
set_time_limit(0);
ob_implicit_flush();
echo 'usr='. get_current_user().'<br/>';
$address = 'localhost';
$port = 4444; //Different port numbers produce same result
if (($sock = socket_create(AF_UNIX, SOCK_STREAM, 0)) === false)
{
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
exit();
}
if (socket_bind($sock, $address, $port) === false)
{
echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
exit();
}
...
Diese Ergebnisse in
usr=root
Warning: socket_bind(): unable to bind address [98]: Address already in use in /var/www/nbr/socket.php auf der Linie 28 socket_bind() fehlgeschlagen: Grund: Address already in use
Ich habe versucht eine Reihe von Dingen, die geben Hinweise, was das problem sein kann, aber nicht, wie es zu lösen. socket_getsockname produziert Müll, wenn ich versuche, auf der echo-Adresse und port-Informationen, wenn ich aber ändern AF_UNIX
zu AF_INET
, und fügen Sie
$addr = ""; $pt = "";
echo "Socket name ok: " . socket_getsockname($sock, &$addr, &$pt) . '<br/>';
echo $addr . ", " . $pt . '<br/>';
das Ergebnis ist
Socket-name-ok: 1
0.0.0.0, 0
Also ist Adresse/port einfach nie richtig einstellen irgendwie? Auch ein nachträgliches socket_get_option($sock, 0, SO_REUSEADDR)
schlägt mit AF_UNIX
gelingt es ihm, mit AF_INET
aber ich bekomme immer noch die Adresse nicht verfügbar Fehler.
Was mache ich falsch?
- AF_UNIX ist, einen lokalen unix-domain-socket - grundsätzlich eine Datei irgendwo auf Ihrem Computer. Als solche gibt es keine "Adresse" oder "port", da es eine Datei. AF_INET bedeutet, dass eine TCP/IP-socket, für die IST es ein port/Adresse.
- Ein lokales domain-socket ist, was ich will--ich wusste nicht, es war eine Datei. Wird die Bearbeitung in irgendeiner Weise helfen mein Problem, und wenn ja, wissen Sie, wo es ist, oder wie ich es finden kann?
- Wenn Sie nur wollen, zu Lesen von einem socket, der bereits vorhanden ist, dann verwenden Sie einfach die regulären fopen/fread/fclose Zeug, sonst wird dieser andere Antwort sollte helfen: stackoverflow.com/questions/307692/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
socket_bind
bindet einen socket auf dem lokalen Computer. Die Bindung einer Buchse bedeutet behalten uns eine Adress - /port für einen socket. Sie in der Regel verwenden Sie es für einen listener (server) nicht als client. In Ihrem Fall, da der server (Qt) ist bereits gestartet, dann wird die Adresse bereits verwendet wird, sosocket_bind
fehl.Wenn Sie wollen eine Verbindung zu einem socket, verwenden Sie
socket_connect
:Wenn Sie möchten, um eine Verbindung zu einem lokalen socket (z.B.: über eine socket-Datei, und nicht über TCP/UDP):
Erste klare Verwendung von port: