2011-03-15 60 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

相关问题