2017-04-21 72 views
1

我是一名嘗試瞭解TCP的初學者,我正在使用Rust。如果我創建一個新的偵聽器並將其綁定到一個地址如何爲多個消費者重用服務器端TCP端點?

let tcplistener = TcpListener::bind("127.0.0.1:55555").unwrap(); 

我可以127.0.0.1:55555和客戶端上的一些其他端點之間tcplistener.accept()新的連接。

在我的情況下,tcplistener住在表示插件的結構的一個實例中。每個插件應該可以從它自己的瀏覽器選項卡控制。每個插件有一個連接(端點對),其中一個端點始終爲127.0.0.1:55555。插件運行在一個非阻塞偵聽器和流的線程中。我使用websockets,但我不確定這個問題是否特定於websockets。

我現在正在做的是

  • 實例化插件中
  • 接受來自瀏覽器選項卡中的第一個連接到插件後一個
  • ,在插件中的tcplistener領域分配給新創建任意操作系統分配端口的監聽器

這似乎工作;如果之後我實例化一個新的插件B,我可以創建一個綁定到127.0.0.1:55555並接受連接的偵聽器。如果我不創建具有不同地址/端口的新偵聽器,則會出現「地址已被使用」錯誤。

這顯然不是一個好的解決方案,因爲它無緣無故地佔用了所有其他端口。有沒有更好的辦法?

註釋說:

爲什麼每個插件有TcpListener?爲什麼不給收聽者一個組件,請致電accept,然後將返回的TcpStream交給每個構建的插件?

這聽起來不錯,但是TcpListener的存儲位置在哪裏?它如何切換流?我看到用於存儲的可能性:

  • 房東。我無法修改插件主機,我只是插件作者。
  • 一個專用插件。我看到的問題是,插件無法訪問存儲在另一個插件中的任何信息,所以我不知道該怎麼做。
  • 一個單獨運行的過程。我可以想象單獨運行一臺服務器並讓插件成爲客戶端。用戶可以將他們的瀏覽器連接到服務器,該服務器以某種方式代理插件。聽起來很合理,但這裏的不便之處在於,插件用戶必須將服務器安裝爲單獨的軟件包。所以我真的想避免這種情況。雖然我想啓動服務器可以在插件實例化時自動完成,也許這是要走的路?
+0

第一個建議(選項<>)起作用!這真的很棒!我完全不瞭解Option <>的本質,我必須更徹底地閱讀文檔。到目前爲止,它只用於空指針。我怎樣才能接受這個答案?關於實例化的建議:有趣的是,我還沒有完全想到它通過。我的猜測是實例化只能從主機完成。如果它*在技術上是可能的,那麼在其他地方我沒有看到它是不尋常的(理所當然,這並不意味着太多,我是一個初學者)。順便說一句,這是關於LV2音頻插件標準。 – poidl

+0

您可能感興趣的https://www.reddit.com/r/rust/comments/61h21t/writing_an_audio_plugin_in_rust/ – Shepmaster

+0

感謝您的鏈接,這看起來很有趣! – poidl

回答

1

一種解決方法是,如果我正確理解了所有限制,則使用OptionOption正好用於「某件事或某件事情」的情況。

在這裏,你可以有一個Option<TcpListener>。在剛剛初始化的插件上,它將設置爲Some(...),一旦被接受,將轉換爲None

這確實有一些缺點的:

  • 還有的地方有沒有聽衆的時間段。
  • 你必須處理聆聽者爲None的可能性。
  • 在第一個插件接受某件事之前,您無法啓動第二個插件。

某種親子關係可能更好,或者甚至限於單身插件,如果可能的話。

+0

選項<>,是的!好處關於缺點。特別是第三個,我根本沒有想過這個。謝謝你的幫助! – poidl

相關問題