2017-10-05 592 views
0

我想使用原始命令將文件上傳到FTP服務器。是的,我知道有些程序和軟件包可以做到這一點,但我的嵌入式應用程序沒有這種奢侈品。我的問題是,成功發佈所有適當的命令後,我發現該文件不存在於服務器上。如何使用原始FTP STOR命令

這裏就是我所做的:

  1. 我建立一個命令套接字連接到端口21(Sock1)我的FTP服務器並接收問候(代碼220)
  2. 我送 「USER 名爲myUsername」 和接收成功代碼331
  3. 我發送 「PASS 輸入mypassword」 和接收成功代碼230
  4. 我發送 「TYPE I」 和接收成功代碼200
  5. 我發送「PASV」並接收成功代碼227以及6個數字。
  6. 我將這些數字解碼爲IP地址和端口。他們看起來合理。
  7. 我成功地打開了一個TCP數據套接字連接到上面的地址和端口(Sock2)。
  8. 我發送 「STOR mYfILEname的」 並獲得成功代碼150
  9. 我successfuly發送mYfILEname的的內容Sock2。
  10. 我關閉Sock2,然後關閉Sock1。

似乎一切都好了,但服務器上沒有文件。有人能告訴我我做錯了什麼嗎?

我知道服務器的確定,因爲我可以使用各種FTP客戶端程序(使用PUT命令)上傳文件。

+1

除了您應該等待服務器確認成功的傳輸,即在步驟#10關閉sock2,等待服務器226並且然後關閉sock1之後,這看起來基本沒問題。也許還可以添加一個退出命令,包括在關閉sock1之前等待響應。除此之外,你的實際實施可能與你在這裏描述的不同。 –

+0

你是對的Steffen,首先關閉sock2並等待226修復它。如果您將此作爲「答案」提交,我會接受它。 – DontPanic

回答

2
  1. 我成功地將myfilename的內容發送到Sock2。
  2. 我關閉Sock2,然後關閉Sock1。

當傳輸完成所述數據連接(sock2)需要關閉的信號數據發送到服務器的末尾。然後服務器將回復給客戶端的226響應。在關閉控制通道(sock1)之前應讀取此響應。如果sock1和sock2幾乎在同一時間關閉,就像在這裏完成的那樣,可能發生服務器在數據通道關閉(sock2)之前記錄了控制通道(sock1)的關閉,並且因此將數據傳輸視爲中止。