【问题标题】:bind() - how to call bind() multiple times on the same socketbind() - 如何在同一个套接字上多次调用 bind()
【发布时间】:2017-04-10 19:06:36
【问题描述】:

我在将端口值设置为 0 的地址上使用 bind()。我知道通过这种方式,它将随机端口绑定到该地址。但我只想要值 x 的端口,使得 (x >= 0 && x = 49152) 被选择,但我注意到,在可以选择的随机端口中,也有端口 > 49152 。 但是,如果我重新调用 bind() ,它会给出错误:无效参数。 如何重新调用 bind() 函数而不给出无效参数错误,或者如何以另一种方式解决此问题? 提前非常感谢。

【问题讨论】:

  • 您的问题是关于tcp,而不是unix-sockets
  • 如果您知道要绑定()到哪个端口,您最好将该端口提供给 bind() 调用而不是 0。如果该端口已在使用中,则绑定( ) 调用将失败,然后您可以使用不同的端口号重试。
  • @EJP 似乎unix-sockets 是一个非常好的标签,它没有任何地方说它是关于 TCP 的;它也可能与 UDP 套接字有关。

标签: sockets tcp bind sockaddr-in


【解决方案1】:

您不能在已绑定的套接字上再次调用bind()。一旦绑定了套接字,就不能更改它的绑定。

绑定到端口 0 将绑定到一个可用的随机临时端口,临时端口的范围由操作系统而非应用程序控制。某些操作系统确实提供了配置值来设置范围,但您需要成为管理员才能更改它。

要执行您要查找的操作,请完全不要绑定到端口 0。而是绑定到特定的所需端口,如果它不可用,则 bind() 将失败,您可以通过使用不同的端口再次调用 bind() 来处理错误,根据需要重复,直到绑定成功或您用尽了您的所需端口的列表。

【讨论】:

    【解决方案2】:

    你不能。您必须关闭套接字并重新开始。您不能对获得的端口如此挑剔。他们的系统会给你任何它给你的东西。

    【讨论】:

    • 有时候,挑剔是有道理的。例如,FTP 服务器可能只想使用一小部分端口进行PASV 传输,因此它必须能够控制端口范围的上下限。
    • @RemyLebeau 在这种情况下,您应该循环通过 那些 端口尝试绑定,直到您成功。绑定到端口 zero 然后抱怨结果是徒劳的,本质上是矛盾的。
    猜你喜欢
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多