C 使用通配符ip绑定套接字

C 使用通配符ip绑定套接字,c,linux,udp,C,Linux,Udp,我创建了一个UDP套接字,并将该套接字绑定到inaddr\u any(0.0.0.0)和一些 众所周知的端口号。据我所知,该套接字可以通过指定的端口号通过机器的所有接口接收数据。 但是当我调用send()时,它将使用默认的IP地址作为源地址 如何选择默认IP地址 如果我想使用其他接口(默认接口除外)发送数据,该如何实现 问题的背景: 我正在执行自民党协议。它可以有许多hello邻接。因此,我创建了一个服务器,从路由器的其他接口接收数据。一旦形成hello邻接,hello消息将通过创建hell

我创建了一个UDP套接字,并将该套接字绑定到
inaddr\u any(0.0.0.0)
和一些 众所周知的端口号。据我所知,该套接字可以通过指定的端口号通过机器的所有接口接收数据。 但是当我调用
send()
时,它将使用默认的IP地址作为源地址

  • 如何选择默认IP地址
  • 如果我想使用其他接口(默认接口除外)发送数据,该如何实现
问题的背景:


我正在执行自民党协议。它可以有许多hello邻接。因此,我创建了一个服务器,从路由器的其他接口接收数据。一旦形成hello邻接,hello消息将通过创建hello邻接的UDP在特定接口上发送。

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

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

如果我用一个特定的地址绑定套接字,那么肯定可以做到这一点。如果我用0.0.0.0绑定了套接字,那么有没有办法显式地将源地址设置为used?是的,用
bind
。默认情况下,您只能绑定到本地地址(即在本地网络接口上配置的地址),但有一个选项可以设置为允许绑定到非本地IP…我不能绑定同一个套接字两次,一次绑定0.0.0,另一次绑定不同的IP?您不能绑定套接字两次。如果套接字已经绑定到某个地址,即使绑定到0.0.0.0,
bind
也会失败,出现
EINVAL
错误。@SumitTrehan如果您解释了要解决的问题,可能会有所帮助。没有明显的理由让您想绑定到所有接口,然后从许多同样合适的接口中选择一个用于给定的
send
,听起来每个接口都需要一个套接字。