我创建了一个 UDP 套接字并将该套接字绑定(bind)到 inaddr_any (0.0.0.0)
和一些
众所周知的端口号。据我了解,此套接字可以通过指定端口号接收机器所有接口(interface)上的数据。
但是当我调用 send()
时,它将使用默认 IP 地址作为源地址。
- 如何选择默认 IP 地址?
- 如果我想使用其他接口(interface)(默认接口(interface)除外)来发送数据,该怎么做?
问题的背景:
我正在实现 LDP 协议(protocol)。它可以有许多 hello 邻接。因此,我正在创建一个服务器来从路由器的其他接口(interface)接收数据。一旦 hello 邻接形成,hello 消息将通过创建 hello 邻接的 UDP 在特定接口(interface)上发送。
最佳答案
默认 IP 地址是根据数据包发送到的网络选择的。例如,如果您有两个接口(interface),一个连接到网络 A,另一个连接到网络 B,如果您向网络 B 发送数据包,则数据包将使用第二个接口(interface)的 IP 地址发送。因此,大多数时候您不必担心。
如果您有两个网络接口(interface)连接到同一个网络,您可以将套接字绑定(bind)
到其中一个的地址,数据包将使用该地址发送出去。例如,如果网络堆栈允许,这会将 IP 套接字绑定(bind)到 192.168.122.1
:
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("192.168.122.1");
addr.sin_port = 0;
if (bind(s, (struct sockaddr*) &addr, sizeof addr) == -1) {
perror("bind");
}
关于c - 使用通配符 ip 的套接字绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18685883/