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

时间:2015-03-10 09:37:38

标签: c sockets port

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

这是我试过的:

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

有什么想法吗?

3 个答案:

答案 0 :(得分: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之外的所有端口(端口22除外)映射到端口11944.然后,您只需绑定到程序中的端口11944。

答案 1 :(得分:1)

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

如果您只想发送UDP数据报,可以sendto之前bind。任何可用的端口都将用作源。

答案 2 :(得分:-3)

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

如果您想捕捉每个港口,您正在寻找的是RAW SOCKET。

此处有更多信息:https://en.wikipedia.org/wiki/Raw_socket

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