尝试获取具有相同地址和不同端口的套​​接字来来回传递数据

时间:2014-08-15 18:19:14

标签: c multicast ports

首先,请原谅我可能的屠宰技术术语。我已经被接受了插槽IO,几乎没有接受过正规教育,我知道我是在左右笨拙地说话。

我正在尝试在C中构建一个客户端和服务器,使多个客户端能够相互连接。一般程序如下:

1)服务器有一个端口不断监听和接受连接
2)客户端连接该端口
3)服务器创建一个新的套接字(相同的地址,不同的端口号),告诉客户端连接到该套接字,并关闭与客户端的连接。
4)客户端连接到指定的套接字,并为服务器提供它想要的信道 5)服务器将该套接字放置在指定的通道上 6)对连接到服务器的每个客户端重复步骤2到5 / *以上所有内容均已编码* /
7)一旦一个频道有2个或更多成员,我希望每个成员端口能够广播到同一频道中的所有其他端口(因此客户端相互通信)

在这种情况下,同一通道上所有相关的套接字都具有相同的地址和不同的端口号。我所阅读和研究的有关广播和多播的一切都围绕着每个具有相同端口号和不同地址的通信器。

有没有办法在C中进行我希望做的沟通?

2 个答案:

答案 0 :(得分:0)

我认为你想使用TCP的listen()和accept()函数。您可以执行您描述的操作并让客户端相互通信,但所有流量都将作为集线器通过服务器运行。

如果您希望所有客户能够与其他客户交谈,您可以选择以下几种方式:

  1. 服务器是所有数据的中心,并在客户端之间为您传递

  2. 客户端与其他客户端保持直接连接,并相互传递数据以便于集线器。这意味着要进行大量的数据复制。

  3. 广播或多播(UDP)。这只能在本地网络上实现,因为互联网路由器将阻止多播和广播流量。

  4. 我可能会选择#1。

答案 1 :(得分:0)

请记住,每个客户端都有自己的IP地址,因此,如果客户端与其他客户端通信,而不涉及服务器,则需要与其他客户端打开新连接,发送数据然后关闭连接。虽然可行,但我认为这个想法不会很好地扩展。

我同意Syplex认为让服务器充当中继枢纽可能是最好的,并且肯定有可能扩展。所以数据流将是这样的:

  • 客户端收到要重新发送给所有其他客户端的消息。
  • 此消息将传递给服务器进程的所有其他实例
  • 服务器进程的每个实例都会发送消息。

问题在于您如何实现服务器,并且您确实有两个适合您所描述的模型:

(1)您正在使用多线程服务器,其中每个新连接都会导致生成一个线程来处理客户端和服务器之间的通信。

(2)您正在使用分叉服务器,其中服务器分叉新进程与客户端进行通信。

在情况(1)中,您将对进程内通信(例如消息队列)感兴趣,而在情况(2)中,您将对进程间通信(例如命名管道或共享内存)感兴趣。

此时有两个很多变量可以给出简明的答案。我希望这有助于你开始,至少让你在某个地方开始寻找。