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)字节文件在服务器上具有正确的文件名。
奇怪的是,是,
- 相同的代码/连接信息工作在另一台笔记本电脑OK
- 使用FileZilla中推着文件在几个发生
- 问题时,相同的连接信息工程确定服务器(即它不只是一个具体的目的地,有问题)
此外,这似乎没有任何关系与被动模式(它失败与无线这个启用)
有没有人有任何建议?
谢谢
abe
您正在使用活动的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)。
注意,我们看到端口20和21在ftp_close()之前在cmd行上使用netstat -n打开。 PHP文档建议端口20是数据通道,但我们正在讨论有问题的INBOUND问题(服务器到PC)。 添加了防火墙规则以打开INBOUND上的端口20和21后,我可以看到php的工作原理。但目前尚不清楚(a)为什么PHP需要20端口(而Filezilla没有),(b)为什么其他PC没有相同的问题(都是公司PC,相同的型号/年龄/版本),以及(c)我应该使用什么防火墙修复(如果有的话)。 – user1432181
因为默认情况下FileZilla使用被动模式,所以你应该这样做,就像重复问题中的答案所表明的那样。 –
向我们展示详细的FileZilla日志。 –