0

我有一个服务器多客户端 udp 应用程序。有一个带有单个套接字 (socket#1) 的单个线程 (thread#1) 可以连续接收来自 client#1 的数据。这个接收线程的任务是在它的套接字上不断地接收数据。

我在服务器应用程序 GUI 上有一个按钮,上面写着“向 Client#1 发送数据”。按下此按钮时,我希望我的接收线程暂停接收并在套接字#1 上发送一些数据,当发送数据时,恢复连续接收。

如何才能做到这一点?如果我什至在按下按钮时 postthreadmessage() ,接收线程不会检查这些发布的消息,因为它总是在 while 循环中接收消息。它如何检查与按下的按钮相对应的已发布消息?

编辑:另一个建议

如果我让我的套接字“事件驱动”怎么办?即,每当套接字上有一些数据可供读取时,就会生成 FD_READ 事件并且我可以在套接字上读取,并且每当我想在套接字上写入一些数据时,我都会生成一个事件 FD_WanttoWrite,然后将数据写入套接字上。类似的事情可能吗?

(我知道 FD_READ,但是当我想在 Socket 上写东西时我不确定 FD_WanttoWrite)

4

2 回答 2

3

你真的不需要暂停你的阅读线程。只是send/to()使用相同套接字(甚至是不同的套接字,因为 UDP 是无连接的)的按钮 Click 处理程序内部的数据。

暂停阅读线程的唯一真正原因是,如果发送的数据收到您不希望接收线程看到的响应。如果是这种情况,那么您有几个选择:

  1. 让接收线程将任何响应传递给按钮 Click 处理程序,以便在需要时进行处理。

  2. 向接收线程添加一个标志,告诉它停止从套接字读取。让按钮在发送时设置标志,然后在完成时清除标志。让接收线程的循环使用select()一个小的超时,以便循环的每次迭代都可以检查标志并在标志设置时跳过读取。

  3. 像您建议的那样,切换到事件驱动的套接字并在接收线程中使用消息循环。然后你可以将消息传递给线程,例如一条消息告诉它在 FD_READ 消息到达时跳过阅读,另一条消息继续阅读。如果您希望线程send/to()代表按钮调用,您也可以为此发送消息,并且在发送过程中任何读取都将被隐式阻止。

于 2013-05-14T21:14:45.963 回答
1

您可以从另一个线程(即:Gui 或与您的接收线程不同的新后台线程)执行此操作。您需要访问套接字,因此您可能需要调整其范围。

于 2013-05-14T11:14:32.687 回答