Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 尝试获取具有相同地址和不同端口的套接字来来回传递数据_C_Multicast_Ports - Fatal编程技术网

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

C 尝试获取具有相同地址和不同端口的套接字来来回传递数据,c,multicast,ports,C,Multicast,Ports,首先,请原谅我对技术术语的误解。我几乎没有受过什么正规教育,就被扔进了插座IO,我知道我把单词弄得乱七八糟 我正在尝试用C语言构建一个客户机和服务器,使多个客户机能够相互连接。一般程序如下所示: 1) 服务器有一个端口不断侦听和接受连接 2) 客户端在该端口上连接 3) 服务器创建一个新套接字(相同的地址,不同的端口号),通知客户端连接到该套接字,并关闭与客户端的连接。 4) 客户端连接到指定的套接字,并为服务器提供它希望使用的通道 5) 服务器将该套接字放在指定的通道上 6) 对连接到服务器的

首先,请原谅我对技术术语的误解。我几乎没有受过什么正规教育,就被扔进了插座IO,我知道我把单词弄得乱七八糟

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

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

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


有没有一种方法可以实现我希望在C语言中实现的通信?

我想您应该为TCP使用listen()和accept()函数。您可以做您描述的事情,让客户机彼此对话,但所有流量都将作为一个集线器通过服务器运行

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

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

  • 客户机与其他客户机保持直接连接,并相互传递数据,以方便集线器。这意味着大量的数据复制

  • 广播或多播(UDP)。这只能通过本地网络实现,因为internet路由器将阻止多播和广播流量


  • 我可能会选择#1。

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

    我同意Syplex的观点,即让服务器充当中继集线器可能是最好的,而且肯定具有良好的扩展潜力。所以数据流应该是这样的:

    • 客户端接收一条消息,该消息将被重新传输给所有其他客户端
    • 此消息将传递给服务器进程的所有其他实例
    • 服务器进程的每个实例都会发送消息
    问题在于您是如何实现服务器的,并且您确实有两种适合您所描述的模型:

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

    (2) 您正在使用一个分叉服务器,在该服务器中,该服务器分叉一个新进程以与客户机通信

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


    在这一点上,有两个多变量可以给出一个简洁的答案。我希望这有助于你开始,至少给你一个开始寻找的地方。

    我想客户端必须告诉服务器广播一些东西,所以广播是一种方式吗?我需要一种特定类型的广播或通用代码的变体吗?你不需要任何特定的东西-只要让服务器通过所有连接的客户端循环,并向每个客户端发送任何消息。没有办法让两个套接字具有相同的地址和不同的端口号,相互通信?不是直接通信:套接字表示一对(源、目标)。您不能动态重新配置目标,也不能与多个目标通信。TCP是可靠的,它包含一个处理重传等的底层,所以一般来说,多播和广播不适用于TCP。我为每个客户端设计了一个新的进程,并得出了相同的结论(管道或共享内存:这将是充当中继中心的服务器,对吗?)。但是,如果具有不同端口号的套接字可以通信,则会从数据流中删除服务器中间人。是的,服务器充当中间人。是的,如果“具有不同端口号的套接字可以通信”,这将减少数据流,并使程序的逻辑更容易。然而,正如其他人所说,这不是套接字的工作方式。很高兴我们能帮上忙