【问题标题】:Socket broadcast basics套接字广播基础
【发布时间】:2015-05-19 13:33:57
【问题描述】:

我正在构建一个应用程序,该应用程序将有效地部署在具有公共“服务器”的多个“客户端”上。显然,我可以为每个客户端-服务器链接使用单个读写套接字在每个客户端和服务器之间进行通信,或者如果我真的想要的话,我可以为每个链接使用一个读套接字和一个写套接字。

但是,如果有(希望是好的)服务器想要从任何客户端读取数据并广播回所有客户端的原因,该怎么办?如果您有像 UDP 这样的无连接协议,服务器可以只使用一个读写套接字,还是必须使用一个用于读取和一个用于写入?客户呢?如果您使用 TCP 等基于连接的协议,这种情况会改变吗?

【问题讨论】:

    标签: sockets


    【解决方案1】:

    如果你有像 UDP 这样的无连接协议,服务器可以只使用一个读写套接字,还是必须使用一个用于读取和一个用于写入?客户呢?如果您使用 TCP 等基于连接的协议,这种情况会改变吗?

    作为端点的套接字,在 UDP 和 TCP 的情况下至少有一个本地地址和端口。只有为此 ip 和端口接收到的数据才会传送到套接字,并且从此套接字发送的所有数据都包含本地 ip 和端口作为源。可以连接套接字,在这种情况下,目标 IP 和端口也是已知的。使用 TCP 需要连接套接字,使用 UDP 则不需要。

    这意味着:

    • 您可以使用同一个未连接的 UDP 套接字向多个对等方发送数据(目标是 sendto 函数的参数)。您不能使用 TCP 来执行此操作,即您需要为每个对等方连接一个套接字。
    • 您可以在未连接的 UDP 套接字上接收来自多个对等方的数据。你不能用 TCP 做到这一点。
    • 特殊广播地址可用于 UDP,但不能用于 TCP,因为使用 TCP,您只需要在两个客户端之间建立连接,而广播则不是这种情况。

    有关更多信息,另请参阅相关问题和答案:Bidirectional UDP Multicast

    【讨论】:

    • 谢谢 - 非常有帮助。
    【解决方案2】:

    但是如果有(希望是好的)服务器想要的原因怎么办? 从任何客户端读取,然后向所有人广播?

    好吧,那么您可能想要使用 UDP 套接字(代替某些 TCP 套接字,或者除此之外):)

    如果你有像UDP这样的无连接协议,服务器可以使用吗? 只有一个读写套接字,或者它必须使用一个用于读取和 一个写字?

    单个 UDP 套接字足以用于读取和写入(尽管一些多线程设计可能会发现使用两个单独的套接字更容易;任何一种方式都可以)。

    客户呢?

    客户端也可以使用单个套接字来发送和接收 UDP 数据包,如果这是您所要求的。

    如果您使用 TCP 等基于连接的协议,这种情况会改变吗?

    使用 TCP 套接字,您还可以使用单个套接字进行发送和接收。但是,对于要发送或接收的每个目标,您都需要一个 TCP 套接字。 (与 UDP 相比,单个 UDP 套接字可以与 sendto() 或 recvfrom() 结合使用以与多个对等方通信)

    【讨论】:

    • 谢谢 - 也很有帮助。
    【解决方案3】:

    根据您的要求,您有两种方法:

    1. 仅使用 TCP 连接:服务器从客户端读取消息并广播给所有客户端,服务器将消息写入所有客户端的 TCP 套接字(连接到客户端),客户端读取该消息从TCP socket(连接到服务器)。这种方法要求客户端和服务器知道对方的IP地址

    2. 使用 TCP 连接进行客户端-服务器直接通信和 UDP 进行广播:在这种方法中,客户端和服务器使用 TCP 连接进行通信(直接一对一)。为了广播消息,服务器可以使用 UDP 套接字通过网络广播消息,客户端有 UDP 广播接收器来接收广播消息。

    【讨论】:

    • 你真的是说没有办法对所有事情都使用 UDP 吗?这对我来说似乎不太可能。如果真的是这样,我想知道为什么不这样做。
    • 我们知道 UDP 是无连接的(不太可靠),而 TCP 是面向连接的(更可靠)。您还可以在 UDP 数据包中为特定目标定义目标 IP,但它是无连接的,不太可靠。 UDP 主要用于目的地未知的情况。当目的地已知时,最好使用 TCP,因为它非常可靠。你可以只使用 UDP,但它不太可靠,所以我建议你同时使用 TCP 和 UDP。
    • 这里有很多问题,其中“UDP 主要用于目的地未知”。 UDP 用于 VoIP 场景中的实时音频和视频,用于 DNS、syslog... 目的地始终是已知的,但它可能是多个系统可以接收的广播目的地。但大多数情况下 UDP 用于单一目的地,例如 TCP。
    • TCP 不要求服务器知道客户端的地址。 UDP不能在目的地未知时使用,除非你在谈论广播或多播。
    猜你喜欢
    • 2011-01-23
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多