【问题标题】:How to bind() on all ports?如何在所有端口上绑定()?
【发布时间】:2015-05-11 16:27:32
【问题描述】:

我想使用一个作为端口的套接字,任何可用的端口。但我真的不知道该怎么做

这是我尝试过的:

s_in.sin_family = AF_INET;
s_in.sin_port = htons(0);
s_in.sin_addr.s_addr = INADDR_ANY;

有什么想法吗?

【问题讨论】:

  • 如果您像在代码示例中那样分配端口号 0,bind 将为您选择一个空闲端口号。
  • 上面的代码有什么问题?看起来不错。
  • 问题是如果我对`htons(0)没有错的话,它会占用一个随机端口。但我希望它占用所有端口,而不是随机一个。
  • 你不能,你也不想。如果这是可能的,没有其他服务可以运行。
  • @nookonee 您需要更好地解释您的用例。我认为没有人理解你想要做什么。

标签: c sockets port


【解决方案1】:

这取决于你想要做什么。如果要接收数据,必须将套接字绑定到端口。这就是港口的目的。您可以设置“原始套接字”,但这意味着您必须自己处理传输层标头:您不能忘记它们。

如果你只是想发送一个 UDP 数据报,你可以sendto 没有事先的bind。任何可用的端口都将用作源。

【讨论】:

    【解决方案2】:

    如果您希望使用任何可用端口,您可以从 1024 循环到 65355,尝试在第一个可用端口上绑定您的套接字。

    如果您想捕获每个端口,您正在寻找的是一个 RAW SOCKET。

    更多信息在这里:https://en.wikipedia.org/wiki/Raw_socket

    这里是 linux :http://linux.die.net/man/7/raw

    【讨论】:

      【解决方案3】:

      AFAIK,你不能。一种解决方案是使用端口转换。如果您使用的是 Linux,您可以执行以下操作:

      iptables -t nat -A PREROUTING -d 128.66.0.1/32 -p tcp -m tcp --dport 22 -j ACCEPT
      iptables -t nat -A PREROUTING -d 128.66.0.1/32 -p tcp -m tcp --dport 1:65535 -j DNAT --to-destination 128.66.0.1:11944
      

      这会将除端口 22 之外的所有端口映射到端口 11944。然后您只需在程序中绑定到端口 11944。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-06
        • 1970-01-01
        • 1970-01-01
        • 2019-10-30
        • 2014-09-10
        • 2016-10-11
        • 1970-01-01
        相关资源
        最近更新 更多