多个套接字可以与 UDP 的同一端口相关联吗?
Posted
技术标签:
【中文标题】多个套接字可以与 UDP 的同一端口相关联吗?【英文标题】:Can multiple sockets be associated with same port for UDP? 【发布时间】:2011-09-03 03:21:35 【问题描述】:我认为多个套接字可以与同一个 TCP 端口相关联。
但同样的事情也适用于 UDP 吗?
【问题讨论】:
【参考方案1】:在 TCP 中将多个套接字与一个端口关联的唯一方法是侦听然后接受。
这种情况下的目的是为每个传入的客户端提供一个唯一的套接字,以保持它们的字节流分开。
在 UDP 的情况下您不需要它,因为没有字节流。您可以使用单个 UDP 套接字编写整个 UDP 服务器。您只需读取,发送到该客户端的处理程序,处理程序通过同一个套接字写回响应。
【讨论】:
这个问题意味着:1)来自不同源 ip 地址的数据包,或 2)来自同一源 ip 上不同源端口的数据包。无论哪种方式,根据定义,这些 是 不同的套接字。当你说“在 UDP 的情况下你不需要那个(套接字?)”时,我不太明白你的意思 @Mike Pennington 服务器只需要一个监听端口。每个请求数据报都通过该端口进入,并包含自己的回复地址。每个回复数据报都可以通过该端口发送到请求数据报的回复地址。所以,只有一个数据报套接字。您的 (1) 和 (2) 对此没有任何影响:它们只是不同的回复地址。 @ejp 我说的是客户端 IP 和端口。不管怎样,我们都同意服务器端口是相同的。 @Mike Pennington 我已经回答过了。在 Java 中,就像将响应放入请求到达的同一个 DatagramPacket 中一样简单,然后通过单个 DatagramSocket 将其发送回来。告诉我你为什么认为 > 1 是必需的。 @EJP,我错了。 DATAGRAM SOCKETS 由一个二元组标识,而 STREAM SOCKETS 由一个四元组标识。为您的回答 +1【参考方案2】:是的,也可以使用单个 UDP 端口拥有多个套接字。
【讨论】:
需要注意的是只有广播和多播数据包会被多路复用,单播数据包只会被传递到第一个套接字。 @caf 怎么可能?请参阅cs.cmu.edu/~srini/15-441/F01.full/www/assignments/P2/… 如果第二个套接字尝试绑定到接口 1 上的端口 8000,则绑定将失败,因为第一个套接字已经“拥有”该端口/接口 @entropy:这是默认行为,但许多操作系统允许程序请求禁用该行为。有关这方面的更多信息,请参阅this answer。以上是关于多个套接字可以与 UDP 的同一端口相关联吗?的主要内容,如果未能解决你的问题,请参考以下文章
使用套接字在同一主机中的进程之间进行通信,可以使用UDP吗?
关于socket通信UDP协议的问题,在客户端client下创建两个套接字s、s1分别用于recvfrom()和sendto()。