PHP ftp_put返回“无法建立数据连接:连接被拒绝”

问题描述:

我有一台PC通过PHP运行一些FTP,我知道在1-2个月前工作,但现在我回到它上面我发现PC已不再工作。我知道我一直在使用PC,但我无法想象可能发生了什么变化。PHP ftp_put返回“无法建立数据连接:连接被拒绝”

的PHP抛出了错误信息读取

无法建立数据连接:连接被拒绝

...当我用ftp_put()功能。

我使用的削减代码:

<?php 

$trackErrors = ini_get('track_errors'); 
ini_set('track_errors', 1); 

$server="***.***.***.***"; 
$port=21; 
echo "<LI>Connecting to $server:$port<BR>"; 
$conn_id = ftp_connect($server,$port,9999999) or die("<BR>Unable to connect to ".$server.":$port server."); 
if (!$conn_id) { 
    $errmsg = $php_errormsg; 
    echo "<BR><LI>ERR:$errmsg"; 
} 
else { 
    $passive=false; 
    echo "<LI>Setting Passive Mode=$passive"; 
    ftp_pasv($conn_id, $passive); 

    $user="*********"; 
    $pass="*********"; 
    echo "<LI>Connecting as $user/*****"; 
    if (!ftp_login($conn_id, $user, $pass)) { 
     $msg = "Failed to login to $selected_server as $user; <BR>check logincredentials in the Settings"; 
     echo "<BR><LI>$msg"; 

     $errmsg = $php_errormsg; 
     echo "<LI>ERR:$errmsg"; 
     return $msg; 
    } 

    ftp_set_option($conn_id, FTP_TIMEOUT_SEC, 10000); 


    if ([email protected]_put($conn_id, "test.txt", "C:......test.txt", FTP_BINARY)) { 
     echo "<BR><LI>ftp_put failed"; 

     $errmsg = $php_errormsg; 
     echo "<LI>ERR:$errmsg"; 
    } 
    echo "<HR>Done"; 
} 
?> 

为网页运行此当输出

Connecting to ***.***.***.***:21 
Setting Passive Mode= 
Connecting as *******/***** 
ftp_put failed 
ERR:ftp_put(): Unable to build data connection: Connection refused 
Done 

的结果是ftp_put()给出了错误信息,并留下一个零(0)字节文件在服务器上具有正确的文件名。

奇怪的是,是,

  1. 相同的代码/连接信息工作在另一台笔记本电脑OK
  2. 使用FileZilla中推着文件在几个发生
  3. 问题时,相同的连接信息工程确定服务器(即它不只是一个具体的目的地,有问题)

此外,这似乎没有任何关系与被动模式(它失败与无线这个启用)

有没有人有任何建议?
谢谢
abe

+0

注意,我们看到端口20和21在ftp_close()之前在cmd行上使用netstat -n打开。 PHP文档建议端口20是数据通道,但我们正在讨论有问题的INBOUND问题(服务器到PC)。 添加了防火墙规则以打开INBOUND上的端口20和21后,我可以看到php的工作原理。但目前尚不清楚(a)为什么PHP需要20端口(而Filezilla没有),(b)为什么其他PC没有相同的问题(都是公司PC,相同的型号/年龄/版本),以及(c)我应该使用什么防火墙修复(如果有的话)。 – user1432181

+0

因为默认情况下FileZilla使用被动模式,所以你应该这样做,就像重复问题中的答案所表明的那样。 –

+0

向我们展示详细的FileZilla日志。 –

您正在使用活动的FTP模式。在主动模式下,服务器尝试连接到客户端。在大多数网络配置中,这是不可能的,因为客户端机器通常位于防火墙后面。

这就是为什么服务器失败:

无法建立数据连接:连接被拒绝

这是专门针对这种情况ProFTPD的错误消息。

有关详细信息,请参阅我在active and passive FTP connection modes上的文章。


的代码可以在其他机器上工作,如果他们有防火墙,禁用或者如果他们有规则,允许在非特权端口的传入流量。

FileZilla的工作原理是默认为被动模式(与大多数现代FTP客户端一样)。


你声称也尝试被动模式,但得到相同的错误信息。

这是因为您正在使用ftp_pasv调用不正确。

您必须在ftp_login之后移动ftp_pasv致电

$user = "*********"; 
$pass = "*********"; 
echo "<LI>Connecting as $user/*****"; 
if (!ftp_login($conn_id, $user, $pass)) { 
    // ... 
} 

$passive = true; 
echo "<LI>Setting Passive Mode=$passive"; 
ftp_pasv($conn_id, $passive); 

The documentation清楚地表明它:

请注意,ftp_pasv()只能在成功登录后调用或否则会失败。


对于类似的问题(只是纯-ftpd),而看PHP upload via FTP - ftp_put() I won't open a connection to x.x.x.x (only to y.y.y.y)