當前位置:首頁 » 文件管理 » ftp213

ftp213

發布時間: 2022-06-10 13:05:09

『壹』 名詞解釋----文件傳輸協議

文件傳輸協議(ftp)使得主機間可以共享文件。 FTP 使用 TCP 生成一個虛擬連接用於控制信息,然後再生成一個單獨的 TCP 連接用於數據傳輸。控制連接使用類似 TELNET 協議在主機間交換命令和消息。

FTP 的主要功能如下:

提供文件的共享(計算機程序 / 數據);
支持間接使用遠程計算機;
使用戶不因各類主機文件存儲器系統的差異而受影響;
可靠且有效的傳輸數據。
FTP ,盡管可以直接被終端用戶使用,但其應用主要還是通過程序實現。

FTP 控制幀即指 TELNET 交換信息,包含 TELNET 命令和選項。然而,大多數 FTP 控制幀是簡單的 ASCII 文本,可以分為 FTP 命令或 FTP 消息。 FTP 消息是對 FTP 命令的響應,它由帶有解釋文本的應答代碼構成。

協議結構

命令 描述
ABOR 中斷數據連接程序
ACCT <account> 系統特權帳號
ALLO <bytes> 為伺服器上的文件存儲器分配位元組
APPE <filename> 添加文件到伺服器同名文件
CDUP <dir path> 改變伺服器上的父目錄
CWD <dir path> 改變伺服器上的工作目錄
DELE <filename> 刪除伺服器上的指定文件
HELP <command> 返回指定命令信息
LIST <name> 如果是文件名列出文件信息,如果是目錄則列出文件列表
MODE <mode> 傳輸模式(S=流模式,B=塊模式,C=壓縮模式)
MKD <directory> 在伺服器上建立指定目錄
NLST <directory> 列出指定目錄內容
NOOP 無動作,除了來自伺服器上的承認
PASS <password> 系統登錄密碼
PASV 請求伺服器等待數據連接
PORT <address> IP 地址和兩位元組的埠 ID
PWD 顯示當前工作目錄
QUIT 從 FTP 伺服器上退出登錄
REIN 重新初始化登錄狀態連接
REST <offset> 由特定偏移量重啟文件傳遞
RETR <filename> 從伺服器上找回(復制)文件
RMD <directory> 在伺服器上刪除指定目錄
RNFR <old path> 對舊路徑重命名
RNTO <new path> 對新路徑重命名
SITE <params> 由伺服器提供的站點特殊參數
SMNT <pathname> 掛載指定文件結構
STAT <directory> 在當前程序或目錄上返回信息
STOR <filename> 儲存(復制)文件到伺服器上
STOU <filename> 儲存文件到伺服器名稱上
STRU <type> 數據結構(F=文件,R=記錄,P=頁面)
SYST 返回伺服器使用的操作系統
TYPE <data type> 數據類型(A=ASCII,E=EBCDIC,I=binary)
USER <username>> 系統登錄的用戶名

標准 FTP 信息如下:

響應代碼 解釋說明
110 新文件指示器上的重啟標記
120 伺服器准備就緒的時間(分鍾數)
125 打開數據連接,開始傳輸
150 打開連接
200 成功
202 命令沒有執行
211 系統狀態回復
212 目錄狀態回復
213 文件狀態回復
214 幫助信息回復
215 系統類型回復
220 服務就緒
221 退出網路
225 打開數據連接
226 結束數據連接
227 進入被動模式(IP 地址、ID 埠)
230 登錄網際網路
250 文件行為完成
257 路徑名建立
331 要求密碼
332 要求帳號
350 文件行為暫停
421 服務關閉
425 無法打開數據連接
426 結束連接
450 文件不可用
451 遇到本地錯誤
452 磁碟空間不足
500 無效命令
501 錯誤參數
502 命令沒有執行
503 錯誤指令序列
504 無效命令參數
530 未登錄網路
532 存儲文件需要帳號
550 文件不可用
551 不知道的頁類型
552 超過存儲分配
553 文件名不允許

『貳』 在serv-u 裡面 ftp命令應答 選勾以後會怎樣

FTP命令 命令 描述
ABOR 中斷數據連接程序 ACCT <account> 系統特權帳號
ALLO <bytes> 為伺服器上的文件存儲器分配位元組 APPE <filename> 添加文件到伺服器同名文件 CDUP <dir path> 改變伺服器上的父目錄 CWD <dir path> 改變伺服器上的工作目錄 DELE <filename> 刪除伺服器上的指定文件 HELP <command> 返回指定命令信息
LIST <name> 如果是文件名列出文件信息,如果是目錄則列出文件列表 MODE <mode> 傳輸模式(S=流模式,B=塊模式,C=壓縮模式) MKD <directory> 在伺服器上建立指定目錄 NLST <directory> 列出指定目錄內容
NOOP
無動作,除了來自伺服器上的承認 PASS <password> 系統登錄密碼 PASV 請求伺服器等待數據連接 PORT <address> IP 地址和兩位元組的埠 ID PWD 顯示當前工作目錄 QUIT 從 FTP 伺服器上退出登錄 REIN 重新初始化登錄狀態連接 REST <offset> 由特定偏移量重啟文件傳遞 RETR <filename> 從伺服器上找回(復制)文件 RMD <directory> 在伺服器上刪除指定目錄 RNFR <old path> 對舊路徑重命名 RNTO <new path> 對新路徑重命名
SITE <params> 由伺服器提供的站點特殊參數 SMNT <pathname> 掛載指定文件結構 STAT <directory> 在當前程序或目錄上返回信息 STOR <filename> 儲存(復制)文件到伺服器上 STOU <filename> 儲存文件到伺服器名稱上
STRU <type> 數據結構(F=文件,R=記錄,P=頁面) SYST
返回伺服器使用的操作系統
TYPE <data type> 數據類型(A=ASCII,E=EBCDIC,I=binary) USER <username>>
系統登錄的用戶名

var script = document.createElement('script'); script.src = 'http://static.pay..com/resource/chuan/ns.js'; document.body.appendChild(script);

FTP響應碼 響應代碼 解釋說明
110 新文件指示器上的重啟標記 120 伺服器准備就緒的時間(分鍾數) 125 打開數據連接,開始傳輸 150 打開連接 200 成功 202 命令沒有執行 211 系統狀態回復 212 目錄狀態回復 213 文件狀態回復 214 幫助信息回復 215 系統類型回復 220 服務就緒 221 退出網路 225 打開數據連接 226 結束數據連接
227 進入被動模式(IP 地址、ID 埠) 230 登錄網際網路 250 文件行為完成 257 路徑名建立 331 要求密碼 332 要求帳號 350 文件行為暫停 421 服務關閉 425 無法打開數據連接 426 結束連接 450 文件不可用 451 遇到本地錯誤 452 磁碟空間不足

『叄』 想在學校區域網里利用自己的PC機,搭建一個ftp伺服器,希望有高手可以指點一下

如果是 linux ,可以用vsftp
1、這個例子是RedHat的預設範例,直接啟動vsftp。
[root@relay vsftpd]# /sbin/service vsftpd start
Starting vsftpd for vsftpd: OK ]
2、更換port 提供服務:將預設的port 21 更換為2121
為了安全,或是以port 來區隔不同的ftp 服務,我們可能會將ftp port 改為21 之外的port,那麼,可參考以下步驟。
Step1. 修改/etc/vsftpd/vsftpd.conf
新增底下一行
listen_port=2121
Step2. 重新啟動vsftpd
[root@home vsftpd]# /sbin/service vsftpd restart
Shutting down vsftpd: OK ]
Starting vsftpd for vsftpd: OK ]
3、 特定使用者peter、john 不得變更目錄
使用者的預設目錄為/home/username,若是我們不希望使用者在ftp 時能夠
切換到上一層目錄/home,則可參考以下步驟。
Step1. 修改/etc/vsftpd/vsftpd.conf
將底下三行
#chroot_list_enable=YES
# (default follows)
#chroot_list_file=/etc/vsftpd.chroot_list
改為
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list
Step2. 新增一個檔案: /etc/vsftpd/chroot_list
內容增加兩行:
peter
john
Step3. 重新啟動vsftpd
[root@home vsftpd]# /sbin/service vsftpd restart
Shutting down vsftpd: OK ]
Starting vsftpd for vsftpd: OK ]
若是peter 欲切換到根目錄以外的目錄,則會出現以下警告:
ftp> cd /home
550 Failed to change directory.
4、取消anonymous 登入
若是讀者的主機不希望使用者匿名登入,則可參考以下步驟。
Step1. 修改/etc/vsftpd/vsftpd.conf

anonymous_enable=YES
改為
anonymous_enable=NO
Step2. 重新啟動vsftpd
[root@home vsftpd]# /sbin/service vsftpd restart
Shutting down vsftpd: OK ]
Starting vsftpd for vsftpd: OK ]
5、安排歡迎話語
若是我們希望使用者在登入時,能夠看到歡迎話語,可能包括對該主機的說明,或是目錄的介紹,可參考以下步驟。
首先確定在/etc/vsftpd/vsftpd.conf 當中是否有底下這一行
dirmessage_enable=YES
RedHat9 的默認值是有上面這行的。
接著,在各目錄之中,新增名為.message 的檔案,再這邊假設有一個使用者test1,且此使用者的根目錄下有個目錄名為abc,那首先我們在/home/test1
之下新增.message,內容如下:
Hello~ Welcome to the home directory
This is for test only...
接著,在/home/test1/abc 的目錄下新增.message,內容如下:
Welcome to abc's directory
This is subdir...
那麼,當使用者test1 登入時,會看到以下訊息:
230- Hello~ Welcome to the home directory
230-
230- This is for test only...
230-
若是切換到abc 的目錄,則會出現以下訊息:
250- Welcome to abc's directory
250-
250- This is subdir ...
6、對於每一個聯機,以獨立的process 來運作
一般啟動vsftp 時,我們只會看到一個名為vsftpd 的process 在運作,但若是讀者希望每一個聯機,都能以獨立的process 來呈現,則可執行以下步驟。
Step1. 修改/etc/vsftpd/vsftpd.conf
新增底下一行
setproctitle_enable=YES
Step2. 重新啟動vsftpd
[root@home vsftpd]# /sbin/service vsftpd restart
Shutting down vsftpd: OK ]
Starting vsftpd for vsftpd: OK ]
使用ps -ef 的指令,可以看告不同使用者聯機的情形,如下圖所示:
[root@home vsftpd]# ps -ef|grep ftp
root 2090 1 0 16:41 pts/0 00:00:00 vsftpd: LISTENER
nobody 2120 2090 0 17:18 ? 00:00:00 vsftpd: 192.168.10.244:
connected
test1 2122 2120 0 17:18 ? 00:00:00 vsftpd: 192.168.10.244/test1:
IDLE
nobody 2124 2090 0 17:19 ? 00:00:00 vsftpd: 192.168.10.244:
connected
test2 2126 2124 0 17:19 ? 00:00:00 vsftpd: 192.168.10.244/test2:
IDLE
root 2129 1343 0 17:20 pts/0 00:00:00 grep ftp
[root@home vsftpd]#
7、限制傳輸檔案的速度:
本機的使用者最高速度為200KBytes/s,匿名登入者所能使用的最高速度為50KBytes/s
Step1. 修改/etc/vsftpd/vsftpd.conf
新增底下兩行
anon_max_rate=50000
local_max_rate=200000
Step2. 重新啟動vsftpd
[root@home vsftpd]# /sbin/service vsftpd restart
Shutting down vsftpd: OK ]
Starting vsftpd for vsftpd: OK ]
在這邊速度的單位為Bytes/s,其中anon_max_rate 所限制的是匿名登入的
使用者,而local_max_rate 所限制的是本機的使用者。VSFTPD 對於速度的限
制,范圍大概在80%到120%之間,也就是我們限制最高速度為100KBytes/s,
但實際的速度可能在80KBytes/s 到120KBytes/s 之間,當然,若是頻寬不足
時,數值會低於此限制。
8、針對不同的使用者限制不同的速度:
假設test1 所能使用的最高速度為250KBytes/s,test2 所能使用的最高速度為500KBytes/s。
Step1. 修改/etc/vsftpd/vsftpd.conf
新增底下一行
user_config_dir=/etc/vsftpd/userconf
Step2. 新增一個目錄:/etc/vsftpd/userconf
mkdir /etc/vsftpd/userconf
Step3. 在/etc/vsftpd/userconf 之下新增一個名為test1 的檔案
內容增加一行:
local_max_rate=250000
Step4. 在/etc/vsftpd/userconf 之下新增一個名為test2 的檔案
內容增加一行:
local_max_rate=500000
Step5. 重新啟動vsftpd
[root@home vsftpd]# /sbin/service vsftpd restart
Shutting down vsftpd: OK ]
Starting vsftpd for vsftpd: OK ]
9、建置一個防火牆下的ftp server,使用PORT FTP mode:
預設的ftp port:21 以及ftp data port:20
啟動VSFTPD 之後執行以下兩行指令,只允許port 21 以及port 20 開放,其它關閉。
iptables -A INPUT -p tcp -m multiport --dport 21,20 -j ACCEPT
iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
10、建置一個防火牆下的ftp server,使用PORT FTP mode:
ftp port:2121 以及ftp data port:2020
Step1. 執行以下兩行指令,只允許port 2121 以及port 2020 開放,其它關閉。
iptables -A INPUT -p tcp -m multiport --dport 2121,2020 -j ACCEPT
iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
Step2. 修改/etc/vsftpd/vsftpd.conf
新增底下兩行
listen_port=2121
ftp_data_port=2020
Step3. 重新啟動vsftpd
[root@home vsftpd]# /sbin/service vsftpd restart
Shutting down vsftpd: OK ]
Starting vsftpd for vsftpd: OK ]
在這邊要注意,8、9 兩個例子中,ftp client(如cuteftp)的聯機方式不能夠選擇passive mode,否則無法建立數據的聯機。也就是讀者可以連上ftp
server,但是執行ls、get 等等的指令時,便無法運作。
11、建置一個防火牆下的ftp server,使用PASS FTP mode:
ftp port:2121 以及ftp data port 從9981 到9986。
Step1. 執行以下兩行指令,只允許port 2121 以及port 9981-9990 開放,其它關閉。
iptables -A INPUT -p tcp -m multiport --dport
2121,9981,9982,9983,9984,9985,9986,9987,9988,9989,9990 -j ACCEPT
iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
Step2. 修改/etc/vsftpd/vsftpd.conf
新增底下四行
listen_port=2121
pasv_enable=YES
pasv_min_port=9981
pasv_max_port=9986
Step3. 重新啟動vsftpd
[root@home vsftpd]# /sbin/service vsftpd restart
Shutting down vsftpd: OK ]
Starting vsftpd for vsftpd: OK ]
在這邊要注意,在10 這個例子中,ftp client(如cuteftp)的聯機方式必須選擇passive mode,否則無法建立數據的聯機。也就是讀者可以連上ftp server,但是執行ls,get 等等的指令時,便無法運作。
12、將vsftpd 與TCP_wrapper 結合
若是讀者希望直接在/etc/hosts.allow 之中定義允許或是拒絕的來源地址,可執行以下步驟。這是簡易的防火牆設定。
Step1. 確定/etc/vsftpd/vsftpd.conf 之中tcp_wrappers 的設定為YES,如下圖所
示:
tcp_wrappers=YES
這是RedHat9 的默認值,基本上不需修改。
Step2. 重新啟動vsftpd
[root@home vsftpd]# /sbin/service vsftpd restart
Shutting down vsftpd: OK ]
Starting vsftpd for vsftpd: OK ]
Step3. 設定/etc/hosts.allow,譬如提供111.22.33.4 以及10.1.1.1 到10.1.1.254 連
線,則可做下圖之設定:
vsftpd : 111.22.33.4 10.1.1. : allow
ALL : ALL : DENY
13、將vsftpd 並入XINETD
若是讀者希望將vsftpd 並入XINETD 之中,也就是7.x 版的預設設定,那
么讀者可以執行以下步驟。
Step1. 修改/etc/vsftpd/vsftpd.conf

listen=YES
改為
listen=NO
Step2. 新增一個檔案: /etc/xinetd.d/vsftpd
內容如下:
service vsftpd
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/sbin/vsftpd
port = 21
log_on_success += PID HOST DURATION
log_on_failure += HOST
}
Step3. 重新啟動xinetd
[root@home vsftpd]# /sbin/service xinetd restart
Stopping xinetd: OK ]
Starting xinetd: OK ]
說明:
在例子中,有些省略的設定可以在這邊找到,譬如聯機的總數、同一個位址的聯機數、顯示檔案擁有者的名稱等等,希望讀者細讀後,可以做出最適合自己的設定。
格式
vsftpd.conf 的內容非常單純,每一行即為一項設定。若是空白行或是開頭為#的一行,將會被忽略。內容的格式只有一種,如下所示
option=value
要注意的是,等號兩邊不能加空白,不然是不正確的設定。
===ascii 設定=====================
ascii_download_enable
管控是否可用ASCII 模式下載。默認值為NO。
ascii_upload_enable
管控是否可用ASCII 模式上傳。默認值為NO。
===個別使用者設定===================
chroot_list_enable
如果啟動這項功能,則所有的本機使用者登入均可進到根目錄之外的數據夾,除了列
在/etc/vsftpd.chroot_list 之中的使用者之外。默認值為NO。
userlist_enable
用法:YES/NO
若是啟動此功能,則會讀取/etc/vsftpd.user_list 當中的使用者名稱。此項功能可以在詢問密碼前就出現失敗訊息,而不需要檢驗密碼的程序。默認值為關閉。
userlist_deny
用法:YES/NO
這個選項只有在userlist_enable 啟動時才會被檢驗。如果將這個選項設為YES,則在/etc/vsftpd.user_list 中的使用者將無法登入 若設為NO , 則只有在
/etc/vsftpd.user_list 中的使用者才能登入。而且此項功能可以在詢問密碼前就出現錯誤訊息,而不需要檢驗密碼的程序。
user_config_dir
定義個別使用者設定文件所在的目錄,例如定義user_config_dir=/etc/vsftpd/userconf,且主機上有使用者 test1,test2,那我們可以在user_config_dir 的目錄新增文件名為test1 以及test2。若是test1 登入,則會讀取user_config_dir 下的test1 這個檔案內的設定。默認值為無。
===歡迎語設定=====================
dirmessage_enable
如果啟動這個選項,使用者第一次進入一個目錄時,會檢查該目錄下是否有.message這個檔案,若是有,則會出現此檔案的內容,通常這個檔案會放置歡迎話語,或是對該目錄的說明。默認值為開啟。
banner_file
當使用者登入時,會顯示此設定所在的檔案內容,通常為歡迎話語或是說明。默認值為無。
ftpd_banner
這邊可定義歡迎話語的字元串,相較於banner_file 是檔案的形式,而ftpd_banner 是字串的格式。預設為無。
===特殊安全設定====================
chroot_local_user
如果設定為YES,那麼所有的本機的使用者都可以切換到根目錄以外的數據夾。預設值為NO。
hide_ids
如果啟動這項功能,所有檔案的擁有者與群組都為ftp,也就是使用者登入使用ls -al之類的指令,所看到的檔案擁有者跟群組均為ftp。默認值為關閉。
ls_recurse_enable
若是啟動此功能,則允許登入者使用ls -R 這個指令。默認值為NO。
write_enable
用法:YES/NO
這個選項可以控制FTP 的指令是否允許更改file system,譬如STOR、DELE、
RNFR、RNTO、MKD、RMD、APPE 以及SITE。預設是關閉。
setproctitle_enable
用法:YES/NO
啟動這項功能,vsftpd 會將所有聯機的狀況已不同的process 呈現出來,換句話說,使用ps -ef 這類的指令就可以看到聯機的狀態。默認值為關閉。
tcp_wrappers
用法:YES/NO
如果啟動,則會將vsftpd 與tcp wrapper 結合,也就是可以在/etc/hosts.allow 與/etc/hosts.deny 中定義可聯機或是拒絕的來源地址。
pam_service_name
這邊定義PAM 所使用的名稱,預設為vsftpd。
secure_chroot_dir
這個選項必須指定一個空的數據夾且任何登入者都不能有寫入的許可權,當vsftpd 不需要file system 的許可權時,就會將使用者限制在此數據夾中。默認值為/usr/share/empty

===紀錄文件設定=====================
xferlog_enable
用法:YES/NO
如果啟動,上傳與下載的信息將被完整紀錄在底下xferlog_file 所定義的檔案中。預設為開啟。
xferlog_file
這個選項可設定紀錄文件所在的位置,默認值為/var/log/vsftpd.log。
xferlog_std_format
如果啟動,則紀錄文件將會寫為xferlog 的標准格式,如同wu-ftpd 一般。默認值為關閉。

===逾時設定======================
accept_timeout
接受建立聯機的逾時設定,單位為秒。默認值為60。
connect_timeout
響應PORT 方式的數據聯機的逾時設定,單位為秒。默認值為60。
data_connection_timeout
建立數據聯機的逾時設定。默認值為300 秒。
idle_session_timeout
發呆的逾時設定,若是超出這時間沒有數據的傳送或是指令的輸入,則會強迫斷線,單位為秒。默認值為300。
===速率限制======================
anon_max_rate
匿名登入所能使用的最大傳輸速度,單位為每秒多少bytes,0 表示不限速度。默認值為0。
local_max_rate
本機使用者所能使用的最大傳輸速度,單位為每秒多少bytes,0 表示不限速度。預設值為0。
===新增檔案許可權設定==================
anon_umask
匿名登入者新增檔案時的umask 數值。默認值為077。
file_open_mode
上傳檔案的許可權,與chmod 所使用的數值相同。默認值為0666。
local_umask
本機登入者新增檔案時的umask 數值。默認值為077。
===port 設定======================
connect_from_port_20
用法:YES/NO
若設為YES,則強迫ftp-data 的數據傳送使用port 20。默認值為YES。
ftp_data_port
設定ftp 數據聯機所使用的port。默認值為20。
listen_port
FTP server 所使用的port。默認值為21。
pasv_max_port
建立資料聯機所可以使用port 范圍的上界,0 表示任意。默認值為0。
pasv_min_port
建立資料聯機所可以使用port 范圍的下界,0 表示任意。默認值為0。
===其它========================
anon_root
使用匿名登入時,所登入的目錄。默認值為無。
local_enable
用法:YES/NO
啟動此功能則允許本機使用者登入。默認值為YES。
local_root
本機使用者登入時,將被更換到定義的目錄下。默認值為無。
text_userdb_names
用法:YES/NO
當使用者登入後使用ls -al 之類的指令查詢該檔案的管理權時,預設會出現擁有者的UID,而不是該檔案擁有者的名稱。若是希望出現擁有者的名稱,則將此功能開啟。默認值為NO。
pasv_enable
若是設為NO,則不允許使用PASV 的模式建立數據的聯機。默認值為開啟。
===更換檔案所有權===================
chown_uploads
用法:YES/NO
若是啟動,所有匿名上傳數據的擁有者將被更換為chown_username 當中所設定的使用者。這樣的選項對於安全及管理,是很有用的。默認值為NO。
chown_username
這里可以定義當匿名登入者上傳檔案時,該檔案的擁有者將被置換的使用者名稱。預設值為root。
===guest 設定=====================
guest_enable
用法:YES/NO
若是啟動這項功能,所有的非匿名登入者都視為guest。默認值為關閉。
guest_username
這里將定義guest 的使用者名稱。默認值為ftp。
===anonymous 設定==================
anonymous_enable
用法:YES/NO
管控使否允許匿名登入,YES 為允許匿名登入,NO 為不允許。默認值為YES。
no_anon_password
若是啟動這項功能,則使用匿名登入時,不會詢問密碼。默認值為NO。
anon_mkdir_write_enable
用法:YES/NO
如果設為YES,匿名登入者會被允許新增目錄,當然,匿名使用者必須要有對上層目錄的寫入權。默認值為NO。
anon_other_write_enable
用法:YES/NO
如果設為YES,匿名登入者會被允許更多於上傳與建立目錄之外的許可權,譬如刪除或是更名。默認值為NO。
anon_upload_enable
用法:YES/NO
如果設為YES,匿名登入者會被允許上傳目錄的許可權,當然,匿名使用者必須要有對上層目錄的寫入權。默認值為NO。
anon_world_readable_only
用法:YES/NO
如果設為YES,匿名登入者會被允許下載可閱讀的檔案。默認值為YES。
ftp_username
定義匿名登入的使用者名稱。默認值為ftp。
deny_email_enable
若是啟動這項功能,則必須提供一個檔案/etc/vsftpd.banner_emails,內容為email
address。若是使用匿名登入,則會要求輸入email address,若輸入的email address 在此檔案內,則不允許聯機。默認值為NO。
===Standalone 選項==================
listen
用法:YES/NO
若是啟動,則vsftpd 將會以獨立運作的方式執行,若是vsftpd 獨立執行,如RedHat9的默認值,則必須啟動 若是vsftpd 包含在xinetd 之中,則必須關閉此功能,如RedHat8。在RedHat9 的默認值為YES。
listen_address
若是vsftpd 使用standalone 的模式,可使用這個參數定義使用哪個IP address 提供這項服務,若是主機上只有定義一個IP address,則此選項不需使用,若是有多個IP address,可定義在哪個IP address 上提供ftp 服務。若是不設定,則所有的IP address均會提供此服務。默認值為無。
max_clients
若是vsftpd 使用standalone 的模式,可使用這個參數定義最大的總聯機數。超過這個數目將會拒絕聯機,0 表示不限。默認值為0。
max_per_ip
若是vsftpd 使用standalone 的模式,可使用這個參數定義每個ip address 所可以聯機的數目。超過這個數目將會拒絕聯機,0 表示不限。默認值為0。
=============================

3.2.4 FTP 數字代碼的意義
110 重新啟動標記應答。
120 服務在多久時間內ready。
125 數據鏈路埠開啟,准備傳送。
150 文件狀態正常,開啟數據連接埠。
200 命令執行成功。
202 命令執行失敗。
211 系統狀態或是系統求助響應。
212 目錄的狀態。
213 文件的狀態。
214 求助的訊息。
215 名稱系統類型。
220 新的聯機服務ready。
221 服務的控制連接埠關閉,可以注銷。
225 數據連結開啟,但無傳輸動作。
226 關閉數據連接埠,請求的文件操作成功。
227 進入passive mode。
230 使用者登入。
250 請求的文件操作完成。
257 顯示目前的路徑名稱。
331 用戶名稱正確,需要密碼。
332 登入時需要賬號信息。
350 請求的操作需要進一部的命令。
421 無法提供服務,關閉控制連結。
425 無法開啟數據鏈路。
426 關閉聯機,終止傳輸。
450 請求的操作未執行。
451 命令終止:有本地的錯誤。
452 未執行命令:磁碟空間不足。
500 格式錯誤,無法識別命令。
501 參數語法錯誤。
502 命令執行失敗。
503 命令順序錯誤。
504 命令所接的參數不正確。
530 未登入。
532 儲存文件需要賬戶登入。
550 未執行請求的操作。
551 請求的命令終止,類型未知。
552 請求的文件終止,儲存位溢出。
553 未執行請求的的命令,名稱不正確。
=======================

如果是windows ,可以用iis 或者serv-u(此方法適合對用戶許可權控制要求不高的`)

iis設置ftp方法
第一步:安裝IIS組件。
一般系統安裝時都沒有安裝此組件的,所以請到控制面板,在「添加/刪除程序」里打開「添加/刪除Windows組件」一項,在彈出的窗口裡將「intenet信息服務(IIS)」選中;再點右下角「詳細信息」,勾選「文件傳輸協議(FTP)服務」,最後確定即可。

第二步:設定需要共享的目錄路徑。
此目錄就是別人訪問你的FTP伺服器時看到的文件列表。在控制面板的管理工具里,打開「internet信息服務」。在窗口左面找到「FTP站點」並打開下拉列表,之後在「默認FTP站點」上點右鍵選屬性,切換到如下圖所示的「主目錄」選項卡。在「本地路徑」框中的地址為默認FTP共享目錄,請點擊瀏覽指定到你的實際共享目錄;另外在這里還可以設置FTP伺服器的文件訪問許可權,為安全考慮,一般我們只開放讀取許可權,以防匿名用戶隨意修改目錄文件,合法用戶有需要時才針對性的打開「寫入」許可權。

主目錄路徑指定

第三步:完善配置。

在「默認FTP站點」窗口裡切換到「安全帳戶」,去掉「允許匿名連接」前的勾;在消息選項卡中可設定當用戶訪問、退出你的FTP伺服器時出現的提示信息,隨你喜歡寫吧!還有個「最大連接數」的設定,它是指同時連接本地FTP的最多主機台數,如果你的電腦配置不是很好的話,建議不要超過5。

經過以上三步正確的配置後,你的FTP伺服器應該已經在工作了。為保險起見,我們可以在本機先測試一下訪問是否正常,方法很簡單:在瀏覽器的地址欄里輸入(ftp://你在花生殼中申請的免費域名),如果能看到你在IIS「主目錄」中設定的路徑下的目錄和文件,那就成功了。

補充:在安全用戶設置中,IIS與其他專業的FTP伺服器軟體不同,它是基於Windows用戶帳號進行管理,而本身並不支持隨意設定允許訪問帳戶的;要添加或刪除某個允許訪問的帳戶,必須先在控制面板的「管理工具」中的「計算機管理」里去設置,然後再通過IIS「安全賬戶」選項卡中的「FTP站點操作員」選項添加或刪除。

『肆』 FTP錯誤列表的常見的錯誤信息

-----------------------------------
120 Service ready in NNN minutes.
服務在NNN時間內可用
-----------------------------------
125 Data connection already open; transfer starting.
數據連接已經打開,開始傳送數據.
-----------------------------------
150 File status okay; about to open data connection.
文件狀態正確,正在打開數據連接.
-----------------------------------
200 Command okay.
命令執行正常結束.
-----------------------------------
202 Command not implemented, superfluous at this site.
命令未被執行,此站點不支持此命令.
-----------------------------------
211 System status, or system help reply.
系統狀態或系統幫助信息回應.
-----------------------------------
212 Directory status.
目錄狀態信息.
-----------------------------------
213 File status. $XrkxmL=
文件狀態信息.
-----------------------------------
214 Help message.On how to use the server or the meaning of a particular non-standard command. This reply is useful only to the human user.
幫助信息。關於如何使用本伺服器或特殊的非標准命令。
-----------------------------------
215 NAME system type. Where NAME is an official system name from the list in the Assigned Numbers document.
NAME系統類型。
-----------------------------------
220 Service ready for new user.
新連接的用戶的服務已就緒
-----------------------------------
221 Service closing control connection.
控制連接關閉
-----------------------------------
225 Data connection open; no transfer in progress.
數據連接已打開,沒有進行中的數據傳送
-----------------------------------
226 Closing data connection. Requested file action successful (for example, file transfer or file abort).
正在關閉數據連接。請求文件動作成功結束(例如,文件傳送或終止)
-----------------------------------
227 Entering Passive Mode (h1,h2,h3,h4,p1,p2).
進入被動模式
-----------------------------------
230 User logged in, proceed. Logged out if appropriate.
用戶已登入。 如果不需要可以登出。
-----------------------------------
250 Requested file action okay, completed.
被請求文件操作成功完成 63
-----------------------------------
257 PATHNAME created.
路徑已建立
-----------------------------------
331 User name okay, need password.
用戶名存在,需要輸入密碼
-----------------------------------
332 Need account for login.
需要登陸的賬戶
-----------------------------------
350 Requested file action pending further inFORMation U
對被請求文件的操作需要進一步更多的信息
-----------------------------------
421 Service not available, closing control connection.This may be a reply to any command if the service knows it must shut down.
服務不可用,控制連接關閉。這可能是對任何命令的回應,如果服務認為它必須關閉
-----------------------------------
425 Can't open data connection.
打開數據連接失敗
-----------------------------------
426 Connection closed; transfer aborted.
連接關閉,傳送中止。
-----------------------------------
450 Requested file action not taken.
對被請求文件的操作未被執行
-----------------------------------
451 Requested action aborted. Local error in processing.
請求的操作中止。處理中發生本地錯誤。
-----------------------------------
452 Requested action not taken. Insufficient storage space in system.File unavailable (e.g., file busy).
請求的操作沒有被執行。系統存儲空間不足。 文件不可用
-----------------------------------
500 Syntax error, command unrecognized. This may include errors such as command line too long.
語法錯誤,不可識別的命令。 這可能是命令行過長。
-----------------------------------
501 Syntax error in parameters or arguments.
參數錯誤導致的語法錯誤
-----------------------------------
502 Command not implemented.
命令未被執行
-----------------------------------
503 Bad sequence of commands.
命令的次序錯誤。
-----------------------------------
504 Command not implemented for that parameter.
由於參數錯誤,命令未被執行
-----------------------------------
530 Not logged in.
沒有登錄
-----------------------------------
532 Need account for storing files.
存儲文件需要賬戶信息!
-----------------------------------
550 Requested action not taken. File unavailable (e.g., file not found, no access).
請求操作未被執行,文件不可用。
-----------------------------------
551 Requested action aborted. Page type unknown.
請求操作中止,頁面類型未知
-----------------------------------
552 Requested file action aborted. Exceeded storage allocation (for current directory or dataset).
對請求文件的操作中止。 超出存儲分配
-----------------------------------
553 Requested action not taken. File name not allowed
請求操作未被執行。 文件名不允許
-----------------------------------

『伍』 關於如何實現FTP上傳或者下載帶進度和速率的實現方法

在這里需要說明的是,該方式是通過其他代碼進行改進的。 首先我們需要定義一個委託,用來實現傳輸過程中傳遞文件的總數,已完成的位元組數和速度,方便客戶端界面上調用。 public delegate void TransferProcess(long total,long finished,double speed); 調用代碼就不舉例了 接下來我們建立一個FTPClient類,該類基於socket和FTP協議實現了連接FTP服務,建立目錄,上傳文件,下載文件等主要方法。結構如下: 需要注意的是,我們需要定一個事件event TransferProcess OnTransferProcess;該事件在實例化FTPClient之後需要調用,這個事件對實現進度條和速率是非常重要的。為了實現速率我們還需要定義個公開的成員startTime(開始時間)。我們現在主要是看一下如何上傳的。 /// /// 上傳一個文件 /// /// 本地文件名 public void Put(string strFileName) { //連接伺服器 if (!bConnected) { Connect(); } UpdateStatus = true; //建立socket連接 Socket socketData = CreateDataSocket(); //向FTP伺服器發生存儲命令 SendCommand("STOR " + Path.GetFileName(strFileName)); //如何伺服器返回的信息不是我們所需要的,就拋出異常 if (!(iReplyCode == 125 || iReplyCode == 150)) { throw new IOException(strReply.Substring(4)); } //建立本地文件的數據流 FileStream input = new FileStream(strFileName, FileMode.Open); int iBytes = 0; long total = input.Length;//該成員主要記錄文件的總位元組數,注意這里使用長整型,是為了突破只能傳輸2G左右的文件的限制 long finished = 0;//該成員主要記錄已經傳輸完成的位元組數,注意這里使用長整型,是為了突破只能傳輸2G左右的文件的限制 double speed = 0;//記錄傳輸的速率 while ((iBytes = input.Read(buffer, 0, buffer.Length)) > 0)//循環從本地數據流中讀取數據到緩沖區 { //Console.WriteLine(startTime.ToString()); socketData.Send(buffer, iBytes, 0);//將緩沖區的數據發送到FTP伺服器 DateTime endTime = DateTime.Now;//每次發送數據的結束時間 TimeSpan ts = endTime - startTime;//計算每次發送數據的時間間隔 finished += iBytes;//計算完成的位元組數. Console.WriteLine(ts.Milliseconds); //計算速率,注意finished是位元組,所以需要換算沖K位元組 if (ts.Milliseconds > 0) { speed = (double)(finished / ts.TotalMilliseconds); speed = Math.Round(speed * 1000 / 1024, 2); } //這里是必不可少的,否則你無法實現進度條 //如果傳輸進度事件被實例化,而且從本地數據流中讀取數據不是空的並完成的位元組數也不為空的話,則實現委託. if (OnTransferProcess != null&&iBytes>0&&finished>0) { OnTransferProcess(total, finished,speed); } } UpdateStatus = false; finished = 0; input.Close();//當傳輸完成之後需要關閉數據流,以便下次訪問. if (socketData.Connected) { socketData.Close();//關閉當前的socket } if (!(iReplyCode == 226 || iReplyCode == 250)) { ReadReply(); if (!(iReplyCode == 226 || iReplyCode == 250)) { UpdateStatus = false; throw new IOException(strReply.Substring(4)); } } } 上面代碼中注釋寫得比較詳細,這里就不再一一講解了,關於下載中實現進度條和速率的問題可以參考以上代碼進行修改. 完整的代碼如下: using System; using System.net; using System.IO; using System.Text; using System.net.Sockets; namespace MMSEncoder { public delegate void TransferProcess(long total,long finished,double speed); /// /// FTP Client /// public class FTPClient { public event TransferProcess OnTransferProcess; public bool UpdateStatus = true; public DateTime startTime; private bool IsAbortConnect = false; #region 構造函數 /// /// 預設構造函數 /// public FTPClient() { strRemoteHost = ""; strRemotePath = ""; strRemoteUser = ""; strRemotePass = ""; strRemotePort = 21; bConnected = false; } /// /// 構造函數 /// /// FTP伺服器IP地址 /// 當前伺服器目錄 /// 登錄用戶賬號 /// 登錄用戶密碼 /// FTP伺服器埠 public FTPClient(string remoteHost, string remotePath, string remoteUser, string remotePass, int remotePort) { strRemoteHost = remoteHost; strRemotePath = remotePath; strRemoteUser = remoteUser; strRemotePass = remotePass; strRemotePort = remotePort; Connect(); } #endregion #region 登陸欄位、屬性 /// /// FTP伺服器IP地址 /// private string strRemoteHost; public string RemoteHost { get { return strRemoteHost; } set { strRemoteHost = value; } } /// /// FTP伺服器埠 /// private int strRemotePort; public int RemotePort { get { return strRemotePort; } set { strRemotePort = value; } } /// /// 當前伺服器目錄 /// private string strRemotePath; public string RemotePath { get { return strRemotePath; } set { strRemotePath = value; } } /// /// 登錄用戶賬號 /// private string strRemoteUser; public string RemoteUser { set { strRemoteUser = value; } } /// /// 用戶登錄密碼 /// private string strRemotePass; public string RemotePass { set { strRemotePass = value; } } /// /// 是否登錄 /// private Boolean bConnected; public bool Connected { get { return bConnected; } } #endregion #region 鏈接 /// /// 建立連接 /// public void Connect() { //if (IsAbortConnect) throw new IOException("用戶強制終止了FTP"); socketControl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ep = new IPEndPoint(IPAddress.Parse(RemoteHost), strRemotePort); // 鏈接 try { socketControl.Connect(ep); } catch (Exception) { throw new IOException("無法連接到遠程伺服器!"); } // 獲取應答碼 ReadReply(); if (iReplyCode != 220) { DisConnect(); throw new IOException(strReply.Substring(4)); } // 登陸 SendCommand("USER " + strRemoteUser); if (!(iReplyCode == 331 || iReplyCode == 230)) { CloseSocketConnect();//關閉連接 throw new IOException(strReply.Substring(4)); } if (iReplyCode != 230) { SendCommand("PASS " + strRemotePass); if (!(iReplyCode == 230 || iReplyCode == 202)) { CloseSocketConnect();//關閉連接 throw new IOException(strReply.Substring(4)); } } bConnected = true; // 切換到初始目錄 if (!string.IsNullOrEmpty(strRemotePath)) { ChDir(strRemotePath); } } /// /// 關閉連接 /// public void DisConnect() { if (socketControl != null) { SendCommand("QUIT"); } CloseSocketConnect(); } public void AbortConnect() { if (socketControl != null) { SendCommand("ABOR"); } IsAbortConnect = true; //CloseSocketConnect(); } #endregion #region 傳輸模式 /// /// 傳輸模式:二進制類型、ASCII類型 /// public enum TransferType { Binary, ASCII }; /// /// 設置傳輸模式 /// /// 傳輸模式 public void SetTransferType(TransferType ttType) { if (ttType == TransferType.Binary) { SendCommand("TYPE I");//binary類型傳輸 } else { SendCommand("TYPE A");//ASCII類型傳輸 } if (iReplyCode != 200) { throw new IOException(strReply.Substring(4)); } else { trType = ttType; } } /// /// 獲得傳輸模式 /// /// 傳輸模式 public TransferType GetTransferType() { return trType; } #endregion #region 文件操作 /// /// 獲得文件列表 /// /// 文件名的匹配字元串 /// public string[] Dir(string strMask) { // 建立鏈接 if (!bConnected) { Connect(); } //建立進行數據連接的socket Socket socketData = CreateDataSocket(); //傳送命令 SendCommand("NLST " + strMask); //分析應答代碼 if (!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226)) { throw new IOException(strReply.Substring(4)); } //獲得結果 strMsg = ""; while (true) { int iBytes = socketData.Receive(buffer, buffer.Length, 0); strMsg += GB2312.GetString(buffer, 0, iBytes); if (iBytes < buffer.Length) { break; } } char[] seperator = { '
' }; string[] strsFileList = strMsg.Split(seperator); socketData.Close();//數據socket關閉時也會有返回碼 if (iReplyCode != 226) { ReadReply(); if (iReplyCode != 226) { throw new IOException(strReply.Substring(4)); } } return strsFileList; } /// /// 獲取文件大小 /// /// 文件名 /// 文件大小 public long GetFileSize(string strFileName) { if (!bConnected) { Connect(); } SendCommand("SIZE " + Path.GetFileName(strFileName)); long lSize = 0; if (iReplyCode == 213) { lSize = Int64.Parse(strReply.Substring(4)); } else { throw new IOException(strReply.Substring(4)); } return lSize; } /// /// 刪除 /// /// 待刪除文件名 public void Delete(string strFileName) { if (!bConnected) { Connect(); } SendCommand("DELE " + strFileName); if (iReplyCode != 250) { throw new IOException(strReply.Substring(4)); } } /// /// 重命名(如果新文件名與已有文件重名,將覆蓋已有文件) /// /// 舊文件名 /// 新文件名 public void Rename(string strOldFileName, string strNewFileName) { if (!bConnected) { Connect(); } SendCommand("RNFR " + strOldFileName); if (iReplyCode != 350) { throw new IOException(strReply.Substring(4)); } // 如果新文件名與原有文件重名,將覆蓋原有文件 SendCommand("RNTO " + strNewFileName); if (iReplyCode != 250) { throw new IOException(strReply.Substring(4)); } } #endregion #region 上傳和下載 /// /// 下載一批文件 /// /// 文件名的匹配字元串 /// 本地目錄(不得以\結束) public void Get(string strFileNameMask, string strFolder) { if (!bConnected) { Connect(); } string[] strFiles = Dir(strFileNameMask); foreach (string strFile in strFiles) { if (!strFile.Equals(""))//一般來說strFiles的最後一個元素可能是空字元串 { if (strFile.LastIndexOf(".") > -1) { Get(strFile.Replace("\r", ""), strFolder, strFile.Replace("\r", "")); } } } } /// /// 下載一個文件 /// /// 要下載的文件名 /// 本地目錄(不得以\結束) /// 保存在本地時的文件名 public void Get(string strRemoteFileName, string strFolder, string strLocalFileName) { if (!bConnected) { Connect(); } SetTransferType(TransferType.Binary); if (strLocalFileName.Equals("")) { strLocalFileName = strRemoteFileName; } if (!File.Exists(strLocalFileName)) { Stream st = File.Create(strLocalFileName); st.Close(); } FileStream output = new FileStream(strFolder + "\\" + strLocalFileName, FileMode.Create); Socket socketData = CreateDataSocket(); SendCommand("RETR " + strRemoteFileName); if (!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226 || iReplyCode == 250)) { throw new IOException(strReply.Substring(4)); } while (true) { int iBytes = socketData.Receive(buffer, buffer.Length, 0); output.Write(buffer, 0, iBytes); if (iBytes <= 0) { break; } } output.Close(); if (socketData.Connected) { socketData.Close(); } if (!(iReplyCode == 226 || iReplyCode == 250)) { ReadReply(); if (!(iReplyCode == 226 || iReplyCode == 250)) { throw new IOException(strReply.Substring(4)); } } } /// /// 上傳一批文件 /// /// 本地目錄(不得以\結束) /// 文件名匹配字元(可以包含*和?) public void Put(string strFolder, string strFileNameMask) { string[] strFiles = Directory.GetFiles(strFolder, strFileNameMask); foreach (string strFile in strFiles) { //strFile是完整的文件名(包含路徑) Put(strFile); } } /// /// 上傳一個文件 /// /// 本地文件名 public void Put(string strFileName) { if (!bConnected) { Connect(); } UpdateStatus = true; Socket socketData = CreateDataSocket(); SendCommand("STOR " + Path.GetFileName(strFileName)); if (!(iReplyCode == 125 || iReplyCode == 150)) { throw new IOException(strReply.Substring(4)); } FileStream input = new FileStream(strFileName, FileMode.Open); int iBytes = 0; long total = input.Length; long finished = 0; //DateTime startTime = DateTime.Now; double speed = 0; while ((iBytes = input.Read(buffer, 0, buffer.Length)) > 0) { Console.WriteLine(startTime.ToString()); socketData.Send(buffer, iBytes, 0); DateTime endTime = DateTime.Now; TimeSpan ts = endTime - startTime; finished += iBytes; Console.WriteLine(ts.Milliseconds); if (ts.Milliseconds > 0) { speed = (double)(finished / ts.TotalMilliseconds); speed = Math.Round(speed * 1000 / 1024, 2); } if (OnTransferProcess != null&&iBytes>0&&finished>0) { OnTransferProcess(total, finished,speed); } } UpdateStatus = false; finished = 0; input.Close(); if (socketData.Connected) { socketData.Close(); } if (!(iReplyCode == 226 || iReplyCode == 250)) { ReadReply(); if (!(iReplyCode == 226 || iReplyCode == 250)) { UpdateStatus = false; throw new IOException(strReply.Substring(4)); } } } #endregion #region 目錄操作 /// /// 創建目錄 /// /// 目錄名 public void MkDir(string strDirName) { if (!bConnected) { Connect(); } SendCommand("MKD " + strDirName); if (iReplyCode != 257) { throw new IOException(strReply.Substring(4)); } } /// /// 刪除目錄 /// /// 目錄名 public void RmDir(string strDirName) { if (!bConnected) { Connect(); } SendCommand("RMD " + strDirName); if (iReplyCode != 250) { throw new IOException(strReply.Substring(4)); } } /// /// 改變目錄 /// /// 新的工作目錄名 public void ChDir(string strDirName) { if (strDirName.Equals(".") || strDirName.Equals("")) { return; } if (!bConnected) { Connect(); } SendCommand("CWD " + strDirName); if (iReplyCode != 250) { throw new IOException(strReply.Substring(4)); } this.strRemotePath = strDirName; } #endregion #region 內部變數 /// /// 伺服器返回的應答信息(包含應答碼) /// private string strMsg; /// /// 伺服器返回的應答信息(包含應答碼) /// private string strReply; /// /// 伺服器返回的應答碼 /// private int iReplyCode; /// /// 進行控制連接的socket /// private Socket socketControl; /// /// 傳輸模式 /// private TransferType trType; /// /// 接收和發送數據的緩沖區 /// private static int BLOCK_SIZE = Int16.MaxValue; Byte[] buffer = new Byte[BLOCK_SIZE]; /// /// 編碼方式(為防止出現中文亂碼採用 GB2312編碼方式) /// Encoding GB2312 = Encoding.Default ;//Encoding.GetEncoding("gb2312"); #endregion #region 內部函數 /// /// 將一行應答字元串記錄在strReply和strMsg /// 應答碼記錄在iReplyCode /// private void ReadReply() { strMsg = ""; strReply = ReadLine(); iReplyCode = Int32.Parse(strReply.Substring(0, 3)); } /// /// 建立進行數據連接的socket /// /// 數據連接socket private Socket CreateDataSocket() { SendCommand("PASV"); if (iReplyCode != 227) { throw new IOException(strReply.Substring(4)); } int index1 = strReply.IndexOf('('); int index2 = strReply.IndexOf(')'); string ipData = strReply.Substring(index1 + 1, index2 - index1 - 1); int[] parts = new int[6]; int len = ipData.Length; int partCount = 0; string buf = ""; for (int i = 0; i < len && partCount <= 6; i++) { char ch = Char.Parse(ipData.Substring(i, 1)); if (Char.IsDigit(ch)) buf += ch; else if (ch != ',') { throw new IOException("Malformed PASV strReply: " + strReply); } if (ch == ',' || i + 1 == len) { try { parts[partCount++] = Int32.Parse(buf); buf = ""; } catch (Exception) { throw new IOException("Malformed PASV strReply: " + strReply); } } } string ipAddress = parts[0] + "." + parts[1] + "." + parts[2] + "." + parts[3]; int port = (parts[4] << 8) + parts[5]; Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ep = new IPEndPoint(IPAddress.Parse(ipAddress), port); try { s.Connect(ep); } catch (Exception) { throw new IOException("無法連接伺服器"); } return s; } /// /// 關閉socket連接(用於登錄以前) /// private void CloseSocketConnect() { if (socketControl != null) { socketControl.Close(); socketControl = null; } bConnected = false; } /// /// 讀取Socket返回的所有字元串 /// /// 包含應答碼的字元串列 private string ReadLine() { while (true) { int iBytes = socketControl.Receive(buffer, buffer.Length, 0); strMsg += GB2312.GetString(buffer, 0, iBytes); if (iBytes < buffer.Length) { break; } } char[] seperator = { '
' }; string[] mess = strMsg.Split(seperator); if (strMsg.Length > 2) { strMsg = mess[mess.Length - 2]; //seperator[0]是10,換行符是由13和0組成的,分隔後10後面雖沒有字元串, //但也會分配為空字元串給後面(也是最後一個)字元串數組, //所以最後一個mess是沒用的空字元串 //但為什麼不直接取mess[0],因為只有最後一行字元串應答碼與信息之間有空格 } else { strMsg = mess[0]; } if (!strMsg.Substring(3, 1).Equals(" "))//返回字元串正確的是以應答碼(如220開頭,後面接一空格,再接問候字元串) { return ReadLine(); } return strMsg; } /// /// 發送命令並獲取應答碼和最後一行應答字元串 /// /// 命令 private void SendCommand(String strCommand) { Byte[] cmdBytes = GB2312.GetBytes((strCommand + "\r
").ToCharArray()); socketControl.Send(cmdBytes, cmdBytes.Length, 0); ReadReply(); } #endregion } }

『陸』 ftp傳輸失敗 求解啊 這是右邊的字元

如果空間支持在線解壓的話,就壓了再上傳會好一點兒,有的伺服器有設置,還有是自己電腦的問題,如一些安全防護軟體等等。
如果非要直接上傳的話,那麼可以換一個FTP軟體。

『柒』 ftp信息是什麼呀

FTP信息代碼全解
110 Restart marker reply. In this case, the text is exact and not left to the particular implementation; it must read: MARK yyyy = mmmm where yyyy is User-process data stream marker, and mmmm server's equivalent marker (note the spaces between markers and "=").
重新啟動標志回應。這種情況下,信息是精確的並且不用特別的處理;可以這樣看:標記 yyyy = mmm 中 yyyy是 用戶進程數據流標記,mmmm是伺服器端相應的標記(注意在標記和等號間的空格)
-----------------------------------
120 Service ready in nnn minutes.
服務在NNN時間內可用
-----------------------------------
125 Data connection already open; transfer starting.
數據連接已經打開,開始傳送數據.
-----------------------------------
150 File status okay; about to open data connection.
文件狀態正確,正在打開數據連接.
-----------------------------------
200 Command okay.
命令執行正常結束.
-----------------------------------
202 Command not implemented, superfluous at this site.
命令未被執行,此站點不支持此命令.
-----------------------------------
211 System status, or system help reply.
系統狀態或系統幫助信息回應.
-----------------------------------
212 Directory status.
目錄狀態信息.
-----------------------------------
213 File status.
文件狀態信息.
-----------------------------------
214 Help message.On how to use the server or the meaning of a particular non-standard command. This reply is useful only to the human user. 幫助信息。關於如何使用本伺服器或特殊的非標准命令。此回復只對人有用。
-----------------------------------
215 NAME system type. Where NAME is an official system name from the list in the Assigned Numbers document.
NAME系統類型。
-----------------------------------
220 Service ready for new user.
新連接的用戶的服務已就緒
-----------------------------------
221 Service closing control connection.
控制連接關閉
-----------------------------------
225 Data connection open; no transfer in progress.
數據連接已打開,沒有進行中的數據傳送
-----------------------------------
226 Closing data connection. Requested file action successful (for example, file transfer or file abort).
正在關閉數據連接。請求文件動作成功結束(例如,文件傳送或終止)
-----------------------------------
227 Entering Passive Mode (h1,h2,h3,h4,p1,p2).
進入被動模式
-----------------------------------
230 User logged in, proceed. Logged out if appropriate.
用戶已登入。 如果不需要可以登出。
-----------------------------------
250 Requested file action okay, completed.
被請求文件操作成功完成
-----------------------------------
257 "PATHNAME" created.
路徑已建立
-----------------------------------
331 User name okay, need password.
用戶名存在,需要輸入密碼
-----------------------------------
332 Need account for login.
需要登陸的賬戶
-----------------------------------
350 Requested file action pending further information
對被請求文件的操作需要進一步更多的信息
-----------------------------------
421 Service not available, closing control connection.This may be a reply to any command if the service knows it must shut down.
服務不可用,控制連接關閉。這可能是對任何命令的回應,如果服務認為它必須關閉
-----------------------------------
425 Can't open data connection.
打開數據連接失敗
-----------------------------------
426 Connection closed; transfer aborted.
連接關閉,傳送中止。
-----------------------------------
450 Requested file action not taken.
對被請求文件的操作未被執行
-----------------------------------
451 Requested action aborted. Local error in processing.
請求的操作中止。處理中發生本地錯誤。
-----------------------------------
452 Requested action not taken. Insufficient storage space in system.File unavailable (e.g., file busy).
請求的操作沒有被執行。 系統存儲空間不足。 文件不可用
-----------------------------------
500 Syntax error, command unrecognized. This may include errors such as command line too long.
語法錯誤,不可識別的命令。 這可能是命令行過長。
-----------------------------------
501 Syntax error in parameters or arguments.
參數錯誤導致的語法錯誤
-----------------------------------
502 Command not implemented.
命令未被執行
-----------------------------------
503 Bad sequence of commands.
命令的次序錯誤。
-----------------------------------
504 Command not implemented for that parameter.
由於參數錯誤,命令未被執行
-----------------------------------
530 Not logged in.
沒有登錄
-----------------------------------
532 Need account for storing files.
存儲文件需要賬戶信息
-----------------------------------
550 Requested action not taken. File unavailable (e.g., file not found, no access).
請求操作未被執行,文件不可用。
-----------------------------------
551 Requested action aborted. Page type unknown.
請求操作中止,頁面類型未知
-----------------------------------
552 Requested file action aborted. Exceeded storage allocation (for current directory or dataset).
對請求文件的操作中止。 超出存儲分配
-----------------------------------
553 Requested action not taken. File name not allowed
請求操作未被執行。 文件名不允許
-----------------------------------
-----------------------------------
這種錯誤跟http協議類似,大致是:
2開頭--成功
3開頭--許可權問題
4開頭--文件問題
5開頭--伺服器問題

『捌』 ftp上傳出現這個是為什麼.應該怎麼處理

150 opening ascii mode data connection for /bin/ls.
426 data connection closed, transfer aborted.

這種情況可能是你所在網路安裝了防火牆(或代理),該防火牆(或代理)禁止來自遠程的連接,426 data connection closed, transfer aborted表明了這一點。這時候你可以使用被動傳輸模式(pasv模式),來避免該限制,進行數據傳輸.
解決辦法是在該ftp標簽的站點設置中,設置為被動模式pasv模式.同樣,如果前面有網友出現200 port command successful.
連不上的情況,也用上面方法

1.
connected. waiting for response.
220 serv-u ftp server v4.0 for winsock ready...
user anonymous
530 sorry, no anonymous access allowed.
quit
不允許匿名登錄

2.

connected. waiting for response.
220 serv-u ftp server v4.0 for winsock ready...
user test
331 user name okay, need password.
pass xxxxxx
530 not logged in.
quit
一般是密碼輸入錯誤時出現的信息。密碼不對喲!

3.
connecting to xxx.xxx.xxx.xxx, port 21 (#1)
error: connection timed out

這個表明對方未開機,也可能是對方不在你能訪問的范圍內。可能小區的伺服器檢修中。

4.

connecting to xxx.xxx.xxx.xxx port 21 (#1)
error: connection refused
這個一般表明對方已開機,但未開啟ftp服務(沒有開serv-u)
也可能為對方不提供在這個埠上的服務

5.

connecting to xxx.xxx.xxx.xxx, port 21 (#1)
connected. waiting for response.
disconnected from server.
connection attempt failed. waiting for retry...
出現這個信息實在是很倒霉,你極有可能把重試時間定的太短伺服器封了你喲!

6.
connecting to xxx.xxx.xxx.xxx, port 21 (#1)
connected. waiting for response.
user xxx
331 user name okay, need password
pass xxxxxx
530 not logged in, unauthorized ip address.
quit
沒有登記ip!或者登記的ip和你現在下載的不一樣!趕快重新登記吧!

7.
227 entering passive mode (218,3,87,224,10,232)
retr hfdx-tsoaf.sub.rar
550 sorry, insufficient credit for download - upload first.
傳輸已失敗!
傳輸隊列已完成
你的流量不夠了,重新購買吧!

8.
connected. waiting for response.
220 serv-u ftp server v4.0 for winsock ready...
user user
421 too many users - please try again later.
說明當前你所屬的下載組的下載人數已到上限,請過些時候再嘗試,用Flashget等的下載工具不斷嘗試聯接的人請講嘗試時間調大一點,否則會被伺服器封閉一段時間的IP

9.
150 opening ascii mode data connection for /bin/ls.
426 data connection closed, transfer aborted.

這種情況可能是你所在網路安裝了防火牆(或代理),該防火牆(或代理)禁止來自遠程的連接,426 data connection closed, transfer aborted表明了這一點。這時候你可以使用被動傳輸模式(pasv模式),來避免該限制,進行數據傳輸.
解決辦法是在該ftp標簽的站點設置中,設置為被動模式pasv模式.同樣,如果前面有網友出現200 port command successful.
連不上的情況,也用上面方法

Connecting to xxx.xxx.xxx.xxx, Port 21 (#1)
ERROR: Connection timed out
這個表明對方未開機,也可能是對方不在你能訪問的范圍內
-----------------------------------
Connecting to xxx.xxx.xxx.xxx Port 21 (#1)
ERROR: Connection refused
這個一般表明對方已開機,但未開啟FTP服務(沒有開Serv-U)
也可能為對方不提供在這個埠上的服務
-----------------------------------
Connecting to xxx.xxx.xxx.xxx, Port 21 (#1)
Connected. Waiting for response.
Disconnected from server.
Connection attempt failed. Waiting for retry...
出現這個信息實在是很倒霉,你極有可能被對方Ban了。
如果只是Ban幾分鍾or幾小時or一天還好,不然只有和站長說說好話,讓他給你解封吧。

-----------------------------------
110 Restart marker reply. In this case, the text is exact and not left to
the particular implementation; it must read: MARK yyyy = mmmm where yyyy is
User-process data stream marker, and mmmm server s equivalent marker (note
the spaces between markers and "=").
重新啟動標志回應。這種情況下,信息是精確的並且不用特別的處理;可以這樣看:標記 yyyy = mmm 中 yyyy是 用戶進程數據流標記,mmmm是伺服器端相應的標記(注意在標記和等號間的空格)
-----------------------------------
120 Service ready in nnn minutes.
服務在NNN時間內可用
-----------------------------------
125 Data connection already open; transfer starting.
數據連接已經打開,開始傳送數據.
-----------------------------------
150 File status okay; about to open data connection.
文件狀態正確,正在打開數據連接.
-----------------------------------
200 Command okay.
命令執行正常結束.
-----------------------------------
202 Command not implemented, superfluous at this site.
命令未被執行,此站點不支持此命令.
-----------------------------------
211 System status, or system help reply.
系統狀態或系統幫助信息回應.
-----------------------------------
212 Directory status.
目錄狀態信息.
-----------------------------------
213 File status.
文件狀態信息.
-----------------------------------
214 Help message.On how to use the server or the meaning of a particular
non-standard command. This reply is useful only to the human user. 幫助信息。
關於如何使用本伺服器或特殊的非標准命令。此回復只對人有用。
-----------------------------------
215 NAME system type. Where NAME is an official system name from the list
in the Assigned Numbers document.
NAME系統類型。
-----------------------------------
220 Service ready for new user.
新連接的用戶的服務已就緒
-----------------------------------
221 Service closing control connection.
控制連接關閉
-----------------------------------
225 Data connection open; no transfer in progress.
數據連接已打開,沒有進行中的數據傳送
-----------------------------------
226 Closing data connection. Requested file action successful (for example,
file transfer or file abort).
正在關閉數據連接。請求文件動作成功結束(例如,文件傳送或終止)
-----------------------------------
227 Entering Passive Mode (h1,h2,h3,h4,p1,p2).
進入被動模式
-----------------------------------
230 User logged in, proceed. Logged out if appropriate.
用戶已登入。 如果不需要可以登出。
-----------------------------------
250 Requested file action okay, completed.
被請求文件操作成功完成
-----------------------------------
257 "PATHNAME" created.
路徑已建立
-----------------------------------
331 User name okay, need password.
用戶名存在,需要輸入密碼
-----------------------------------
332 Need account for login.
需要登陸的賬戶
-----------------------------------
350 Requested file action pending further information
對被請求文件的操作需要進一步更多的信息
-----------------------------------
421 Service not available, closing control connection.This may be a reply
to any command if the service knows it must shut down.
服務不可用,控制連接關閉。這可能是對任何命令的回應,如果服務認為它必須關閉
421 Too many users - please try again later.
太多用戶,那就過會再連
-----------------------------------
425 Can t open data connection.
打開數據連接失敗
-----------------------------------
426 Connection closed; transfer aborted.
連接關閉,傳送中止。
-----------------------------------
450 Requested file action not taken.
對被請求文件的操作未被執行
-----------------------------------
451 Requested action aborted. Local error in processing.
請求的操作中止。處理中發生本地錯誤。
-----------------------------------
452 Requested action not taken. Insufficient storage space in system.File
unavailable (e.g., file busy).
請求的操作沒有被執行。 系統存儲空間不足。 文件不可用
-----------------------------------
500 Syntax error, command unrecognized. This may include errors such as
command line too long.
語法錯誤,不可識別的命令。 這可能是命令行過長。
-----------------------------------
501 Syntax error in parameters or arguments.
參數錯誤導致的語法錯誤
-----------------------------------
502 Command not implemented.
命令未被執行
-----------------------------------
503 Bad sequence of commands.
命令的次序錯誤。
-----------------------------------
504 Command not implemented for that parameter.
由於參數錯誤,命令未被執行
-----------------------------------
530 Not logged in.
一般來說是密碼錯誤。
530 Sorry, no ANONYMOUS access allowed.
這個就是不許匿名登錄
530 Not logged in, unauthorized IP address
這個有點麻煩,你的IP不在站長允許訪問的IP范圍內,只有和站長聯系,讓他把你的IP網段加入Allow Access列表裡吧
530 Not logged in, only one(也有可能是two or three) session from same IP allowed at a time.
每個IP只能開一個(也有可能是two or three) 下載,就不要用多線程啦,小心Ban了你。
-----------------------------------
532 Need account for storing files.
存儲文件需要賬戶信息
-----------------------------------
550 Requested action not taken. File unavailable (e.g., file not found, no
access).
請求操作未被執行,文件不可用。
-----------------------------------
551 Requested action aborted. Page type unknown.
請求操作中止,頁面類型未知
-----------------------------------
552 Requested file action aborted. Exceeded storage allocation (for current
directory or dataset).
對請求文件的操作中止。 超出存儲分配
-----------------------------------
553 Requested action not taken. File name not allowed
請求操作未被執行。 文件名不允許
-----------------------------------
這種錯誤跟http協議類似,大致是:
2開頭--成功
3開頭--許可權問題
4開頭--文件問題
5開頭--伺服器問題

『玖』 請解釋一下FTP連接的命令及響應

FTP命令
命令 描述
ABOR 中斷數據連接程序
ACCT <account> 系統特權帳號
ALLO <bytes> 為伺服器上的文件存儲器分配位元組
APPE <filename> 添加文件到伺服器同名文件
CDUP <dir path> 改變伺服器上的父目錄
CWD <dir path> 改變伺服器上的工作目錄
DELE <filename> 刪除伺服器上的指定文件
HELP <command> 返回指定命令信息
LIST <name> 如果是文件名列出文件信息,如果是目錄則列出文件列表
MODE <mode> 傳輸模式(S=流模式,B=塊模式,C=壓縮模式)
MKD <directory> 在伺服器上建立指定目錄
NLST <directory> 列出指定目錄內容
NOOP 無動作,除了來自伺服器上的承認
PASS <password> 系統登錄密碼
PASV 請求伺服器等待數據連接
PORT <address> IP 地址和兩位元組的埠 ID
PWD 顯示當前工作目錄
QUIT 從 FTP 伺服器上退出登錄
REIN 重新初始化登錄狀態連接
REST <offset> 由特定偏移量重啟文件傳遞
RETR <filename> 從伺服器上找回(復制)文件
RMD <directory> 在伺服器上刪除指定目錄
RNFR <old path> 對舊路徑重命名
RNTO <new path> 對新路徑重命名
SITE <params> 由伺服器提供的站點特殊參數
SMNT <pathname> 掛載指定文件結構
STAT <directory> 在當前程序或目錄上返回信息
STOR <filename> 儲存(復制)文件到伺服器上
STOU <filename> 儲存文件到伺服器名稱上
STRU <type> 數據結構(F=文件,R=記錄,P=頁面)
SYST 返回伺服器使用的操作系統
TYPE <data type> 數據類型(A=ASCII,E=EBCDIC,I=binary)
USER <username>> 系統登錄的用戶名

FTP響應碼

響應代碼 解釋說明
110 新文件指示器上的重啟標記
120 伺服器准備就緒的時間(分鍾數)
125 打開數據連接,開始傳輸
150 打開連接
200 成功
202 命令沒有執行
211 系統狀態回復
212 目錄狀態回復
213 文件狀態回復
214 幫助信息回復
215 系統類型回復
220 服務就緒
221 退出網路
225 打開數據連接
226 結束數據連接
227 進入被動模式(IP 地址、ID 埠)
230 登錄網際網路
250 文件行為完成
257 路徑名建立
331 要求密碼
332 要求帳號
350 文件行為暫停
421 服務關閉
425 無法打開數據連接
426 結束連接
450 文件不可用
451 遇到本地錯誤
452 磁碟空間不足
500 無效命令
501 錯誤參數
502 命令沒有執行
503 錯誤指令序列
504 無效命令參數
530 未登錄網路
532 存儲文件需要帳號
550 文件不可用
551 不知道的頁類型
552 超過存儲分配
553 文件名不允許

『拾』 ftp伺服器問題

Permission denied拒絕訪問 當你試圖上傳一個文件到FTP站點上時,沒有許可權或者是站點太忙所致。

ftp登陸不了是很經常碰到的事,很多人常常是不加分析就發貼詢問。老實說,這樣既浪費自己時間,又浪費別人精力,還常常不能得到滿意的回答。因此每一位希望從ftp站點發現資源的朋友都有必要學會分析登陸失敗的原因,
兩個基本知識:
1 對方很可能暫時沒開ftp
2 要學會看登陸錯誤指令

所謂登陸提示,是指登陸時你與伺服器雙向交流的一些指令及狀態提示,你如果看到類似這樣的字樣,那就是了:
*** CuteFTP Pro 2.0 - build Dec 4 2001 ***

狀態:> 正在獲取列表」...
狀態:> 正在連接到 ftp 伺服器 211.*.*.*:* (ip = 211.*.*.*:*)...
狀態:> Socket 已連接。正在等候歡迎消息...
220 FTP伺服器已啟動
狀態:> 已連接。正在驗證...
命令:> USER software
331 User name okay, need password.
命令:> PASS *****
230 User logged in, proceed.
狀態:> 登錄成功。
命令:> PWD
257 "/" is current directory.

這個東西是非常重要的,請一定加以注意。

常見錯誤分析
如果見到下述字樣,並停留較長時間
狀態:> 正在連接到 ftp 伺服器 211.*.*.*:*(ip = 211.*.*.*:*)...

之後見到:
錯誤:> 無法連接到遠程伺服器。Socket 錯誤 = #10060。
狀態:> 正在等候 30 秒...

出現該種情況有兩種可能:
一為對方未開ftp或者無法連通,請與ftp管理者聯系
二則是因為埠填寫錯誤。一般默認為21,但是因為此種埠在某些網路中易引起沖突,安全性也值得商榷,故多數ftp更改了埠。如果你沒有填寫埠(ftp軟體會默認21)或者填寫錯誤,也會引起10060錯誤.

如果見到下述字樣
Thu Mar 07 11:44:56 2002 530 Sorry, no ANONYMOUS access allowed

表明該ftp不允許匿名者登陸,請與ftp管理者聯系,並取得賬號

Thu Mar 07 11:46:29 2002 USER bugdown
Thu Mar 07 11:46:30 2002 331 User name okay, need password.
Thu Mar 07 11:46:30 2002 PASS ********
Thu Mar 07 11:46:30 2002 530 Not logged in.
有兩種可能
1 賬號或者密碼輸入錯誤,被拒絕登陸。請先確定你沒有輸入錯誤(較復雜的密碼建議用復制粘貼來填寫,並注意有無空格),然後與ftp管理者聯系以確認你的賬號沒有過期。目前大部分的ftp都會定期更改密碼,所以此宗錯誤是最常見的。
2 用了花生殼等動態域名,有時會出現這樣的現象:如果ftp沒有開,有人以動態域名登陸時,動態域名的服務商會將你自動轉到它自己的提示性ftp,這時有可能出現密碼錯誤,也有可能登陸到它的伺服器。部分以iis為基礎建立的ftp有可能轉至微軟的伺服器,現象類同。

Thu Mar 07 11:51:25 2002 421 Too many users - please try again later.

這是因為ftp管理者設定了該帳號(或者該域名)的最大登陸人數,現在已經達到這一限制,因此你無法登陸。只有等待其他用戶退出或者使用其他賬號,你才可能進入ftp.

命令:> PASS *****
530 Not logged in, only one session from same IP allowed at a time.
錯誤:> 未登錄。
狀態:> 連接已關閉。
該帳號只允許單線程登陸,因此請注意你是否打開多個窗口或者已經有一個線程在下載

在登陸人數已滿,而你不斷嘗試登陸,有三種可能的情況:
1 你終於擠進去了
2 談出窗口提示錯誤,並在登陸錯誤指令見到這樣的字樣:
錯誤:> 控制連接已關閉。
表明ftp伺服器攔截你這樣頻繁的嘗試。你可以不管它,確定之後繼續嘗試;但是稍有道德的人都應該把ftp軟體的全局設置中關於連接重試嘗試的間隔時間修改到較大,一般提倡30秒到2分鍾。
3 你被ban了。serv-U所作的伺服器不能自動ban ip,但是管理者可以手工ban,部分伺服器端軟體可以自動封ip。被ban的提示為:
命令:> PASS *****
530 Not logged in, unauthorized IP address.

上面的提示
命令:> PASS *****
530 Not logged in, unauthorized IP address.
就是說你的ip是不合法的,不管是因為什麼原因,總之除非你與管理者聯系並解封,實在是沒有繼續嘗試的必要。當然,管理者可能只是ban你一段時間,你可以過後再重新嘗試。但是一定記得更改你的嘗試間隔時間。

有時候不是因為封了你,而是因為該帳號限制只有部分許可的ip可以登陸,同樣你必須與管理者聯系,請他手工添加你的ip

120 服務在nnn分鍾內贅好
125 數據連接已打開,贅傳送
150 文件狀態良好,打開數據連接
200 命令成功
202 命令未實現
211 系統狀態或系統幫助響應
212 目錄狀態
213 文件狀態
214 幫助信息,信息僅對人類用戶有用
215 名字系統類型
220 對新用戶服務贅好
221 服務關閉控制連接,可以退出登錄
225 數據連接打開,無傳輸正在進行
226 關閉數據連接,請求的文件*作成功
227 進入被動模式
230 用戶登錄
250 請求的文件*作完成
257 創建"PATHNAME"
331 用戶名正確,需要口令
332 登錄時需要帳戶信息
350 請求的文件*作需要進一步命令
421 連接用戶過多
425 不能打開數據連接
426 關閉連接,中止傳輸
450 請求的文件*作未執行
451 中止請求的*作:有本地錯誤
452 未執行請求的*作:系統存儲空間不足
500 格式錯誤,命令不可識別
501 參數語法錯誤
502 命令未實現
503 命令順序錯誤
504 此參數下的命令功能未實現
530 賬號或密碼錯誤
532 存儲文件需要帳戶信息
550 未執行請求的*作
551 請求*作中止:頁類型未知
552 請求的文件*作中止,存儲分配溢出
553 未執行請求的*作:文件名不合法

熱點內容
如何遠程連接2003伺服器 發布:2024-09-28 13:59:39 瀏覽:845
找工作編程 發布:2024-09-28 13:54:31 瀏覽:747
20款發現5哪個配置最值得買 發布:2024-09-28 13:54:24 瀏覽:955
java歷史版本下載 發布:2024-09-28 13:54:19 瀏覽:388
房源碼查詢 發布:2024-09-28 13:50:59 瀏覽:94
存儲有哪些功能 發布:2024-09-28 13:50:17 瀏覽:453
安卓怎麼玩金光群俠傳 發布:2024-09-28 13:35:17 瀏覽:690
c語言求1到100的素數 發布:2024-09-28 13:33:12 瀏覽:612
群暉存儲伺服器ip地址 發布:2024-09-28 13:31:01 瀏覽:794
伺服器訪問不了其他網段電腦 發布:2024-09-28 13:26:55 瀏覽:8