首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回“无法构建数据连接:连接被拒绝”的ftp_put

问返回“无法构建数据连接:连接被拒绝”的ftp_put
EN

Stack Overflow用户
提问于 2017-02-28 17:49:24
回答 1查看 6.1K关注 0票数 2

我有一台PC,它通过PHP运行一些FTP,我知道它在1-2个月前就已经开始工作了,但是现在我又回到了它,我发现PC已经不再工作了。我知道我一直在使用电脑,但我想不出会发生什么变化。

PHP正在抛出错误消息,读取

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

...when我使用ftp_put()函数。

我正在使用的简化代码是:

代码语言:javascript
复制
<?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 (!@ftp_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";
}
?>

将其作为网页运行时的输出是

代码语言:javascript
复制
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. 相同的代码/连接信息在另一台膝上型计算机上工作
  2. 在推送文件时,相同的连接信息使用FileZilla可以正常工作。
  3. 这个问题发生在几个服务器上。不只是一个特定的目的地有问题)

而且,这似乎与被动模式没有任何关系(不管启用与否,它都会失败)。

有人有什么建议吗?

谢谢

Abe

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-02 06:49:04

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

这就是服务器失败的原因:

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

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

有关详细信息,请参阅我在主动和被动FTP连接模式上的文章。

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

FileZilla工作是因为它默认为被动模式(就像大多数现代FTP客户端所做的那样)。

您也声称尝试了被动模式,但是得到了相同的错误消息。

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

您必须在ftp_pasv之后移动ftp_login调用。

代码语言:javascript
复制
$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);

文献资料明确地提出了以下建议:

请注意,只有在成功登录后才能调用ftp_pasv(),否则它将失败。

有关类似的问题(仅使用Pure),请参见put()我不会打开到x.x的连接(只打开Y.Y)。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42515533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档