2017-02-28 62 views
2

我有一臺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日誌。 –

回答

1

您正在使用活動的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)

相關問題