PHP - Sockets können nur verbindungen von localhost (Port Forwarding problem?)
Zuerst einmal herzlichen Dank für die Zeit nehmen, dies zu Lesen. Ich habe ein seltsames problem mit PHP-sockets. Ich arbeite an einem php-socket-daemon, der funktioniert über localhost, aber wenn ich versuche eine Verbindung von außerhalb des LAN, oder einem anderen PC funktioniert es nicht. Ich habe vereinfacht, mein daemon, um eine sehr einfache socket-Verbindung zu replizieren, das Problem für Sie zu sehen.
Grundsätzlich, hier ist das senario. Ich start den socket-daemon auf meinem server auf port 6667. Ich kann eine Verbindung zu dem daemon über telnet und vom browser auf der lokalen Maschine läuft der daemon, aber ich kann nicht von irgendeiner anderen Maschine - der daemon nicht sogar ein Verbindungsversuch gemacht wird.
Weiter zu komplizieren das Problem (das ist, warum ich denke, dass es ein port forwarding Problem sein), mein ISP blockiert port 80, also ich hab das setup dyndns und meinem router den port 8000. Ich habe die Einstellungen für meinen router weitergeleitete port 6667 zu meinem server.
Für den Zugriff auf den daemon aus einem browser, geben Sie mir die folgende (seudo) url:
http://mydomain.com:8000/client.php
Dies funktioniert aus dem lokalen Computer und stellt eine Verbindung her, sondern auch von jeder anderen Maschine, der daemon nicht sogar ein Verbindungsversuch gemacht wird. Allerdings, wenn ich den port angeben, wie diese:
http://mydomain.com:6667
mein Dämon nicht sehen, dass eine Verbindung hergestellt wird, aber natürlich wird dann der browser nicht über eine client-Seite geladen, auf die der Benutzer zur Interaktion mit dem daemon.
Mein client verwendet eine flash-Datei zu erstellen, die die socket-Verbindung (jsocket), aber ich weiß, es ist nicht die cross-domain policy-Datei, weil die Politik richtig ist, und wenn eine Verbindung über localhost, es dient der policy-Datei korrekt.
Hier ist die vereinfachte daemon-code:
<?
//set some variables
$host = '0.0.0.0';
$port = 6667;
//don't timeout!
set_time_limit(0);
//create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
//bind socket to port
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
//start listening for connections
$result = socket_listen($socket, 3) or die("Could not set up socket listener\n");
//accept incoming connections
//spawn another socket to handle communication
$spawn = socket_accept($socket) or die("Could not accept incoming connection\n");
//read client input
$input = socket_read($spawn, 1024) or die("Could not read input\n");
//clean up input string
$input = trim($input);
//echo input back
$output = $input . "\n";
socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n");
//close sockets
socket_close($spawn);
socket_close($socket);
?>
Zusammenfassung:
KANN ich eine Verbindung von localhost per telnet und browser... ich KANN eine Verbindung von anderen Rechnern über telnet, aber ich KANN KEINE Verbindung vom browser von anderen Rechnern über die ip-oder domain-Namen, wenn port 8000 angegeben ist. Der Dämon sieht keine Verbindung versuchen. Wenn ich angeben, port 6667, dann wird der daemon sehen, die eine Verbindung versuchen, aber das ist nutzlos für die Nutzer. 🙁
Jede Hilfe in dieser Angelegenheit würde sehr geschätzt werden! Danke!
Firewall ist deaktiviert...
InformationsquelleAutor C-speed | 2011-02-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie verbindlich die Buchse (mit socket_bind) auf localhost. Lieferung localhost es wird über PHP-binden Sie den socket an die 127.0.0.1.
socket_bind
bindet einen socket an eine bestimmte Schnittstelle. Pro Beispiel:Dieser ermöglicht Ihnen eine Verbindung zu 127.0.0.1:80, aber nicht 192.168.1.100:80, auch wenn Sie der gleichen Maschine. Der socket gebunden ist die 127.0.0.1 Schnittstelle nur:
Wenn Sie möchten, binden Sie den socket an allen verfügbaren Schnittstellen, Verwendung:
Dann funktioniert:
Linux? Windows? Wenn Linux, SELinux aktiviert? Routing (z.B.: iptables)?
netcoder: es wird serviert auf meinem Macbook, firewall ist deaktiviert. Ich sollte auch klarstellen, dass ich in der Tat kann die Verbindung von anderen Rechnern über telnet,..., das ich einfach keine Verbindung vom browser über die ip oder domain-Namen, wenn port 8000 angegeben ist. Der Dämon sieht keine Verbindung versuchen. Wenn ich angeben, port 6667, dann wird der daemon sehen, die eine Verbindung versuchen, aber das ist nutzlos für die Nutzer. 🙁
wollte nur sagen, wie VIEL Ihre Antwort wird sehr geschätzt! Ich danke Ihnen, sir!
InformationsquelleAutor netcoder
Ich dieses "port_forwarding.php" auf dem server zu öffnen, der port 3000 und vorwärts remote-mysql-client-Verbindung zu unix-socket-Datei /port 3306 von mysql-server:
InformationsquelleAutor diyism