【问题标题】:client to client socket communication客户端到客户端套接字通信
【发布时间】:2013-02-17 12:03:08
【问题描述】:

我有一个客户端/服务器程序,它允许通过从服务器生成的线程为多个客户端提供服务。目前该程序仅与服务器通信,但是我现在想重新设计程序,以便客户端可以与另一个客户端建立通信。 在设计这个方面,我没有太多经验知道正确的方向是什么。最初我考虑通过服务器线程进行通信,但是我不确定如何通知该线程的客户端另一个客户端要建立通信。

例如我想从 cli A 到 cli N 通信:

Cli A <---> SerThread A <------> Main Thread <------> SerThread N <---> Cli N

我不确定如何通知 Cli N 需要与 Cli A 通信。

在客户端从套接字读取之前,它不会知道另一个客户端想要与它通信。因此,如果 Cli N 处于等待用户输入直到它发送/接收它不会知道的状态。 我需要一种方法来立即通知客户端正在等待通信。

我想得越多,我就越困惑,所以在我正确地尝试设计这个之前,我可能需要一些指导。

【问题讨论】:

  • 客户端还在先连接服务器吗?服务器不能告诉客户端其他客户端的信息吗?
  • 是的,但是如果客户端没有在套接字上完成接收,例如等待用户输入进行发送/接收,该怎么办。客户端只有在发送/接收时才会收到通知,这取决于用户。有没有办法立即通知客户?我是否必须为此创建另一个套接字连接?
  • 客户端应该总是在 recv() 中阻塞(或者,更有可能在 select() 或 poll() 或一些等效的函数中,只要字节可以从服务器接收,就会返回)。一旦完成,服务器所要做的就是向客户端发送适当的字节,这足以唤醒客户端并让它处理字节。
  • 您不应该在发送/接收之前等待用户输入。UI 线程和“套接字线程”应该是分开的。
  • 是的,我相信最好在客户端设置一个单独的线程。感谢您提供的所有信息,我很困惑,现在意识到解决这个问题并不难。

标签: c++ c sockets pthreads


【解决方案1】:

好吧,你可以让它像开关一样工作:) 我假设您想通过服务器在 2 个客户端之间建立连接,对吗? 如果是这样,您需要做的是给每个客户一个序列号。 然后使用您正在搜索的客户端的信息从客户端向服务器发送“请求”。意思是带有序列号的数据包。 然后服务器可以将信息广播到连接的客户端列表。 在客户端,由于服务器,客户端将收到序列号。 如果客户端收到的序列号与自己的序列号匹配,则客户端将向服务器返回true。如果不是,它将发出假消息。 然后,下次搜索该客户端时,服务器将已经知道它在哪里,并且它将仅将消息发送到该特定客户端。 如果客户端明显断开连接,则序列号将被删除,服务器将丢失有关该客户端的数据。

【讨论】:

  • 是的,服务器可以发送消息,但我的问题是当服务器通知客户端并且客户端没有在套接字上启动接收(等待用户输入)时,我该如何通知客户端呢?我唯一能想到的是在每个客户端上创建辅助连接以接收来自其他客户端的请求。但我不确定是否有更好的方法来处理这个问题。
【解决方案2】:

我强烈建议您阅读Beej's Guide to Network,这是初学者的套接字编程圣经。那里有很多示例,并逐步解释了每个功能,因此如果您花一些时间,您将能够理解所有内容。该指南还包括一个客户端-服务器连接的工作示例,您可以实际查找您遇到的问题。 我通过阅读本指南学到了这种东西!我希望它有帮助! =)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 2012-11-02
    • 2016-08-03
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多