2011-03-15 63 views
1

我想構建兩個通過UDP套接字進行通信的組件。組件1位於主線程中,組件2位於輔助線程中。此應用程序的多個副本可以同時在同一臺計算機上運行,​​因此我無法使用固定端口。該程序還需要在Windows和Linux上運行。如何找到並預留不同線程的可用端口?

我一直在試圖通過綁定2個QUdpSockets指定端口爲0(要求Qt爲我選擇一個自由端口)來做到這一點。然後,我將第一個QUdpSocket和第二個套接字的參數傳遞給組件1,爲它提供發送和接收所需的全部內容。對於組件2,我不認爲我可以跨越線程邊界傳遞QUdpSocket,所以我只傳遞參數並在輔助線程中構造+綁定套接字。

但是,輔助線程中套接字的綁定失敗。大概是因爲主線程中的套接字已經綁定到相同的端口。

有沒有什麼辦法可以解決這個問題,同時在構造任何對象之前仍然知道兩個端口?

+0

只是一個想法,但你總是可以在你分叉成兩個線程之前設置通信管道*。取決於何時創建第二個線程。 – riwalk 2011-03-15 20:36:42

+0

我不明白「我不認爲我可以跨越線程邊界傳遞QUdpSocket」,儘管Qt專家並不認爲這是真的。如果它只是一個資源(一個類實例),那麼它對特定的線程沒有親和力。 – trojanfoe 2011-03-15 20:37:13

+0

是否有你使用套接字在同一應用程序中的兩個線程之間進行通信的原因?你當然可以這樣做,但套接字通信通常保留用於* inter *進程通信,而不是* intra *進程通信。這似乎是在線程之間進行通信的過於複雜的方式。 – 2011-03-15 20:39:05

回答

1

我不認爲我能越過邊界線

你能通過QUdpSocket提供,這樣做。只是不要同時在你的兩個線程中使用它。

+0

這真是個好消息。我對多線程和套接字很陌生,所以他們的交集讓我有些困惑。讓我試試吧.. – cgmb 2011-03-15 20:41:17

+0

完美。有幾件事我不得不記住:使用QObject :: moveToThread將QUdpSocket移動到正確的線程中,並且我有時通過套接字簡要地觸發了它,有時進入組件的數據已經在它們中。但最終它的效果非常好。 – cgmb 2011-03-16 23:20:32

相關問題