gpt4 book ai didi

PHP 套接字 - 只能从本地主机连接(端口转发问题?)

转载 作者:行者123 更新时间:2023-12-03 11:50:29 24 4
gpt4 key购买 nike

首先,感谢您花时间阅读本文。我对 PHP 套接字有一个奇怪的问题。我在一个通过本地主机工作的 php 套接字守护进程上工作,但是当我尝试从 LAN 外部或另一台 PC 连接时,它不起作用。我已将我的守护进程简化为一个非常基本的套接字连接,以复制问题供您查看。

基本上,这是 senario。我在我的服务器上的端口 6667 上启动套接字守护进程。我可以通过 telnet 和运行守护进程的本地机器上的浏览器连接到守护进程,但我不能从任何其他机器连接到守护进程 - 守护进程甚至没有看到连接尝试正在制作中。

为了使问题更加复杂(这就是为什么我认为这是一个端口转发问题),我的 ISP 阻止了端口 80,所以我设置了 dyndns 和我的路由器使用端口 8000。我还设置了我的路由器转发端口 6667 到我的服务器。

要从浏览器访问我的守护程序,我输入以下(伪)URL:

http://mydomain.com:8000/client.php

这在本地机器上工作并且会连接,但是在任何其他机器上,守护进程甚至看不到正在进行的连接尝试。但是,如果我这样指定端口:

http://mydomain.com:6667

我的守护进程确实看到了正在建立的连接,但是浏览器当然没有加载用户可以用来与守护进程交互的客户端页面。

我的客户端使用 flash 文件创建套接字连接 (jsocket),但我知道它不是跨域策略文件,因为该策略是正确的,并且当通过本地主机连接时,它会正确地提供策略文件。

这是简化的守护程序代码:

 <? 

// 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);
?>

总结:

我可以通过 telnet 和浏览器从本地主机连接...我可以通过 telnet 从其他机器连接,但是当指定端口 8000 时,我不能使用 ip 或域名从其他机器的浏览器连接。守护进程看不到任何连接尝试。如果我指定端口 6667,那么守护进程会看到一个连接尝试,但这对用户来说是无用的。 :(

如有任何帮助,我们将不胜感激!谢谢!

最佳答案

您正在将套接字(使用 socket_bind)绑定(bind)到 localhost。提供 localhost 将使 PHP 将套接字绑定(bind)到 127.0.0.1

socket_bind 用于将套接字绑定(bind)到特定接口(interface)。例如:

socket_bind($socket, '127.0.0.1', 80);

这允许您连接到 127.0.0.1:80,但不能连接到 192.168.1.100:80,即使它们是同一台机器。套接字仅绑定(bind)到 127.0.0.1 接口(interface):

$ telnet localhost 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
$ telnet 192.168.1.100 80
Trying 192.168.1.100...
telnet: Unable to connect to remote host: Connection refused

如果要在所有可用接口(interface)上绑定(bind)套接字,请使用:

socket_bind($socket, '0.0.0.0', 80);

然后这个工作:

$ telnet localhost 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
$ telnet 192.168.1.100 80
Trying 192.168.1.100...
Connected to 192.168.1.100.

关于PHP 套接字 - 只能从本地主机连接(端口转发问题?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4938396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com