php中socket_connect上的“连接被拒绝”错误

use*_*925 5 php sockets perl

我正在尝试将一些代码从 perl 转换为 php。

Perl 代码如下所示:

my $handle = Connect($port, $host);

我正在尝试使用套接字在 php 中做同样的事情。我尝试过 socket_create 和 socket_connect、socket_create 和 socket_bind 以及 fsocketopen。

结果,我被错误消息困住了,说“连接被拒绝”或“权限被拒绝”:

socket_connect() [function.socket-connect]:无法连接 [111]:连接被拒绝

我不确定这是我需要解决的问题,还是权限问题,因为 perl 中的代码工作正常(我没有编写该代码)。

我的 php 代码如下所示:

$socket =  socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if(!$socket){
        die('Error: socket_create()');
}
if(!socket_connect($socket,$host,$port)) {
        die('Error: socket_connect()');
}
Run Code Online (Sandbox Code Playgroud)

我不是管理服务器的人,所以如果是权限问题,我需要向其他人询问访问权限。我应该具体要求什么?

还是应该使用其他功能连接到服务器?我是 perl 的新手,所以我不确定 socket_connect 是否是等效的函数。

谢谢。

tom*_*asz 4

如果您的 Perl 代码能够建立连接,则不需要额外的权限即可在 php 中执行相同的操作。连接被拒绝意味着远程主机不允许您进入(您可能连接到错误的地址/端口)。权限被拒绝更令人惊讶,很多人在启用 SELinux 的情况下运行 httpd 脚本时都会遇到这种问题。如果您是其中之一,请参阅 SELinux 联机帮助页:

可以设置 SELinux 策略,不允许 httpd 脚本连接到网络。这可以防止黑客闯入您的 httpd 服务器并攻击其他计算机。如果您需要脚本能够连接,您可以将 httpd_can_network_connect 布尔值设置为:

setebool -P httpd_can_network_connect 1

不过,我对你的例子有一些担忧。Connect从你的 Perl 代码片段来看,似乎不是标准的套接字连接;我不知道它属于哪个模块,但你确定调用背后没有魔法吗?由于socket_connect地址采用点分四组表示法(对于 IPv4),请确保您没有传递主机名(您需要首先进行 DNS 查找)。最后检查它是否确实是您需要的 TCP 套接字,而不是 UDP。