如何在所有端口上绑定()?

How to bind() on all ports?

我想使用带有 as 端口的套接字,任何可用的端口。但是我真的不知道该怎么做

这是我的尝试:

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

有什么想法吗?

这取决于您要做什么。如果您希望接收数据,则必须将套接字绑定到端口。这就是港口的目的。您 可以 设置一个 "raw socket",但这意味着您必须自己处理传输层 headers:您不能忘记它们。

如果您只想发送一个 UDP 数据报,您可以 sendto 无需事先 bind。任何可用端口都将用作源。

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

如果您想捕获每个端口,您正在寻找的是原始套接字。

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

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

据我所知,你不能。一种解决方案是使用端口转换。如果您使用 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。