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/...
Schreibe einen Kommentar