套接字绑定与通配符ip

时间:2013-09-08 16:17:07

标签: c linux udp

我创建了一个UDP套接字并将该套接字绑定到inaddr_any (0.0.0.0)和其他一些套接字 众所周知的港口号码。根据我的理解,这个套接字可以通过指定的端口号在机器的所有接口上接收数据。 但是,当我打电话给send()时,它将使用默认IP地址作为源地址。

  • 如何选择默认IP地址?
  • 如果我想使用其他一些接口(默认值除外)来发送数据,怎么办呢?

问题的背景:

我正在实施LDP协议。它可以有许多你好的邻接。因此,我正在创建一个服务器来从路由器的其他接口恢复数据。一旦形成了hello邻接,那么hello消息将通过UDP发送到特定接口上,在该接口上创建hello邻接。

1 个答案:

答案 0 :(得分:1)

根据数据包发送到的网络选择默认IP地址。例如,如果您有两个接口,一个连接到网络A,另一个连接到网络B,如果您向网络B发送数据包,数据包将与第二个接口的IP地址一起发送。出于这个原因,大多数时候你不必担心

如果您有两个网络接口连接到同一网络,您可以bind套接字到其中一个的地址,并且数据包将以该地址发送。例如,如果网络堆栈允许,这会将IP套接字绑定到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");
}