c - 使用通配符 ip 的套接字绑定(bind)

标签 c linux udp

我创建了一个 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/

相关文章:

c++ - 如何在 udp 连接中绕过 NAT/防火墙

java - 从字节生成公钥时出现无效 key 规范异常

c - 非阻塞连接上的 MacOSX select() 行为不正确

c - 通过头文件使用时 C 中源文件的奇怪输出

linux - Chromium 自动刷新命令行

linux - 如何 RSYNC 单个文件?

java - 局域网上的点对点发现

c - 我应该在我的 C 代码中修复什么?

c - 在 C 中对整数数组求和

linux - 根据 make 的类型覆盖 makefile 变量