簡體   English   中英

從同一台計算機上的同一端口發送數據和ACK

[英]Sending both data and ACKs from the same port on the same machine

我正在用Java實現TFTP (普通FTP)協議。 我有一個客戶端和一個服務器,到目前為止,客戶端可以請求文件,服務器將數據發送給他。

這是我遇到問題的地方-出於明顯的測試原因,我在計算機上同時運行了客戶端和服務器。 但是,發送文件時,必須有兩個套接字在同一端口上偵聽:

  • 客戶端需要監聽收到的數據包
  • 服務器需要偵聽客戶端的確認

...還有兩個各自的套接字,用於發送數據和確認,還共享一個端口。

通常,這確實發生在同一端口上,但在不同的計算機上。 有沒有一種方法可以解決此問題,並使客戶端和服務器在同一主機上和平運行,而沒有任何難看的黑客攻擊? 通過丑陋的黑客,我的意思是:

  • ACK通信端口的預定義偏移量(例如,數據端口上的+15;這是我當前正在使用的偏移量。雖然可以正常工作,但感覺不對且容易出錯)
  • 反復關閉和​​打開套接字(發送數據,用於發送數據的關閉套接字,以便客戶端可以使用該端口發送其ACK等); 目前,這也可行,但也可以通過黑客入侵。 例如,這是我如何“重新打開”用於發送內容的套接字:

    \n 公共無效open(){\n     嘗試{\n         socket = new DatagramSocket(localPortCache);\n     } catch(SocketException e){\n         e.printStackTrace();\n     }\n }\n

這是邪惡的。 我的套接字最初接收動態分配的臨時端口號。 然后,我記住該值,並使用它將我的套接字“還原”到舊端口。 但是,不能保證該端口仍然可用。 通常是這樣,但不能保證。 在這種情況下,我是否過於偏執?

  • 在握手過程中生成一個新的ACK通信端口,並通過控制端口(69)將其發送到客戶端

更新:

我設法解決了我的問題。 我的問題是我沒有嘗試重用套接字。 例如,我從端口X上的套接字發送了一些消息,但隨后嘗試在該端口上分配新的套接字以偵聽ACK,而不僅僅是重用舊的套接字。

客戶端不需要使用固定的端口號。 只需將其綁定為零即可。 無論端口號如何,服務器都應將響應發送回原始客戶端。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM