2015-02-11 59 views
0

我正在實現一種FTP協議。FTP實現:每次關閉數據套接字

我的服務器正在運行。 我啓動客戶端,連接到服務器,然後發送GET file.txt請求。 客戶端解析命令,看到它是GET命令並啓動服務器套接字。 服務器收到該命令,並啓動與客戶端的數據連接,並開始在此連接上發送file.txt。

當服務器發送文件時,它關閉客戶端套接字(Data)。

當我想要獲得另一個文件時,該端口已被使用。我怎樣才能防止這個?我應該保持打開所有命令連接會話的數據連接嗎?在這種情況下,我的客戶如何知道文件何時結束?

由於

回答

1

當套接字被關閉時,它進入TIME WAIT狀態(see here for the possible TCP states)和直到插座離開TIME WAIT並且處於CLOSED狀態沒有其他插座可以被綁定到相同的地址/端口對。

可以去解決這個通過設置SO_REUSEADDR套接字選項,這將允許兩個插座綁定到同一個地址,如果插座中的一個是在TIME WAIT狀態。

+0

這是ftp使用的方式嗎? – 2015-02-11 12:48:05

+0

@FedericoPonzi我其實不知道,但這似乎合乎邏輯。它通常用於所有被動(監聽)插座。 – 2015-02-11 12:52:00

-1

在我的項目,我使用Apache-commons-淨, 只是保持命令連接與心跳命令, 和enter local passive mode每次做文件傳輸活着。 原理與您的情況相同,建議在獲取file.txt之前發送 EPSV 命令。

指的是:https://commons.apache.org/proper/commons-net/