我有一个小型的Web服务器脚本。如果我将它设置为'localhost' - 那么我无法从外部telnet到该端口。如果我将它设置为FQDN - 那么我不能像这样telnet:'telnet localhost 7777'。在这种情况下命名主机的正确方法是什么?
$host = 'localhost';
$port = 7777;
set_time_limit(0);
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
$result = socket_listen($socket, 3) or die("Could not set up socket listener\n");
while(1)
{
$spawn = socket_accept($socket) or die("Could not accept incoming connection\n");
$input = socket_read($spawn, 1024) or die("Could not read input\n");
while(trim($input)!="")
{
$msg=$msg.$input;
$input = socket_read($spawn, 1024) or die("Could not read input\n");
}
$webserver = new Server($msg);
$output = $webserver->response();
unset($msg);
socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n");
socket_close($spawn);
}
答案 0 :(得分:0)
是。你有两个选择。最简单的方法是将套接字绑定到0.0.0.0
,这将套接字绑定到计算机上的所有接口。 (但请确保您确实需要所有接口。)
否则,您始终可以创建> 1套接字,并将它们分别绑定到有意义的接口。
您是用PHP编写整个网络服务器吗?
另外,如果PHP的套接字读取函数像大多数操作系统一样工作,那么你的内部循环可能不正确:虽然HTTP请求以空白结束,但这并不意味着操作系统的read
函数将逐行分割数据。
编辑: socket_read
显然将按行划分结果(这很不寻常),但您需要将其指定为第三个参数。根据文档,默认情况下不逐行,但情况并非总是如此 - 即默认值已更改。您应该指定它以确保升级时代码不会中断。 (也许升级,而你正在......)