[英]Sending both data and ACKs from the same port on the same machine
我正在用Java實現TFTP (普通FTP)協議。 我有一個客戶端和一個服務器,到目前為止,客戶端可以請求文件,服務器將數據發送給他。
這是我遇到問題的地方-出於明顯的測試原因,我在計算機上同時運行了客戶端和服務器。 但是,發送文件時,必須有兩個套接字在同一端口上偵聽:
...還有兩個各自的套接字,用於發送數據和確認,還共享一個端口。
通常,這確實發生在同一端口上,但在不同的計算機上。 有沒有一種方法可以解決此問題,並使客戶端和服務器在同一主機上和平運行,而沒有任何難看的黑客攻擊? 通過丑陋的黑客,我的意思是:
反復關閉和打開套接字(發送數據,用於發送數據的關閉套接字,以便客戶端可以使用該端口發送其ACK等); 目前,這也可行,但也可以通過黑客入侵。 例如,這是我如何“重新打開”用於發送內容的套接字:
\n 公共無效open(){\n 嘗試{\n socket = new DatagramSocket(localPortCache);\n } catch(SocketException e){\n e.printStackTrace();\n }\n }\n
這是邪惡的。 我的套接字最初接收動態分配的臨時端口號。 然后,我記住該值,並使用它將我的套接字“還原”到舊端口。 但是,不能保證該端口仍然可用。 通常是這樣,但不能保證。 在這種情況下,我是否過於偏執?
我設法解決了我的問題。 我的問題是我沒有嘗試重用套接字。 例如,我從端口X上的套接字發送了一些消息,但隨后嘗試在該端口上分配新的套接字以偵聽ACK,而不僅僅是重用舊的套接字。
客戶端不需要使用固定的端口號。 只需將其綁定為零即可。 無論端口號如何,服務器都應將響應發送回原始客戶端。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.