【问题标题】:Guarantee ephemeral port is the same when creating two sockets, one TCP and one UDP创建两个套接字时保证临时端口相同,一个TCP和一个UDP
【发布时间】:2012-08-05 05:49:27
【问题描述】:

是否有一种简单(非迭代)的方法来绑定两个套接字,一个 TCP 和一个 UDP,以保证两者具有相同的临时端口?

我有一个简单的服务器,最初通过 TCP 连接,但也通过 UDP 传输。我不想从客户端发送 UDP 数据包后连接只是为了让服务器发现客户端的 UDP 临时端口。除非必须,否则我不想通过初始 TCP 连接消息发送端口号。

现在,我在 TCP 套接字上的 getsockname 之后显式绑定客户端 UDP 套接字的端口,以发现操作系统分配的临时端口。它还没有失败,但感觉很脆弱。

编辑: 澄清一下,当前的实现假定操作系统永远不会为已被 UDP 套接字使用的 TCP 套接字分配临时端口。

【问题讨论】:

  • 你需要那个端口做什么?你想做什么?
  • 没关系。有很多方法可以在不发送数据的情况下通知服务器第二个临时端口,但如果我能提供帮助,我不想这样做。
  • 这对我来说很重要,因为我很好奇你想做什么。为什么两个临时端口(即客户端操作系统分配为连接或数据流的源端口的端口)必须相同?这样做有什么好处,操作系统分配的随机端口有什么问题?
  • 通知服务器第二个临时端口只会增加复杂性。如果您通过第一个 TCP 连接发送第二个端口号,则客户端和服务器上的代码都会更多。如果您通过 UDP 发送连接数据报,则它是不可靠的并且会添加更多代码。

标签: sockets


【解决方案1】:

将一个绑定到 (0),然后获取本地端口值,然后将另一个绑定到该值。如果失败(端口已经分配),关闭第一个套接字,冲洗,然后重复。

没有别的办法,虽然“感觉”很脆弱。但我不明白为什么你需要它们相同。如果它们是短暂的,那么无论如何其他人都不知道它们是什么,你必须以某种方式宣传它们。

【讨论】:

  • 需要与我无关。我希望它们相同,这样我就不必从客户端发送另一条信息。不,如果我保证第二个端口与第一个端口相同,我不必宣传第二个端口。
  • 另外,虽然我很欣赏这个答案,但这是迭代的,我认为你误解了我对脆弱性的担忧。我知道迭代方法是有效且不易碎的。
  • @CatZimmermann 我不明白。 “迭代”有什么问题吗?您在问题中描述为脆弱的正是这种解决方案。没有误解。
  • 好吧,我要求一个非迭代的解决方案。 :) 脆弱的解决方案是假设操作系统永远不会为已经被 UDP 套接字使用的 TCP 套接字分发临时端口,如问题中所述。
猜你喜欢
  • 2018-05-12
  • 2012-06-23
  • 2011-07-25
  • 2018-12-25
  • 2011-09-03
  • 1970-01-01
  • 2017-09-07
  • 2011-09-20
相关资源
最近更新 更多