套接字广播基础知识

时间:2015-05-19 03:56:24

标签: sockets

我正在构建一个将在多个"客户端上部署的应用程序"与一个共同的"服务器"。显然,我可以使用每个客户端 - 服务器链接的单个读写套接字在每个客户端和服务器之间进行通信,或者如果我真的想要,则每个链接使用一个读取套接字和一个写入套接字。

但是,如果服务器想要从任何客户端读取(并希望是好的)原因并向所有客户端广播,该怎么办?如果你有一个像UDP这样的无连接协议,那么服务器是否只能使用一个读写套接字,或者它必须使用一个用于读取而一个用于写入?客户呢?如果你使用像TCP这样的基于连接的协议,这会改变吗?

3 个答案:

答案 0 :(得分:1)

  

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

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

这意味着:

  • 您可以使用相同的未连接UDP套接字将数据发送到多个对等方(destination是sendto函数的参数)。您无法使用TCP执行此操作,即每个单个对等方都需要连接的套接字。
  • 您可以在未连接的UDP套接字上从多个对等方接收数据。你不能用TCP做到这一点。
  • 特殊广播地址可以与UDP一起使用,但不能与TCP一起使用,因为对于TCP,您需要在两个客户端之间建立连接,而不是广播。

有关详细信息,请参阅相关问题并附上答案:Bidirectional UDP Multicast

答案 1 :(得分:1)

  

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

那么你可能想要使用UDP套接字(代替或替代某些TCP套接字):)

  

如果您有UDP之类的无连接协议,服务器是否可以使用   只有一个读写插座,或者必须使用一个读写插座   一个写作?

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

  

客户怎么样?

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

  

如果你使用像TCP这样的基于连接的协议,这会改变吗?

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

答案 2 :(得分:-2)

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

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

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