user-0 提问: 设备有多个ip地址，发送报文的目的地址已知，如何确认设备发送报文时所用的ip地址，linux环境下对应的C接口是什么？谢谢！！

回复:
user: user-0
content: 搞定了 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>  int create_socket(int port) {     int fd;     struct sockaddr_in addr;     int ret;      fd = socket(AF_INET, SOCK_STREAM, 0);     if (fd < 0) {         perror("CWMP socket:");         return -1;     }      addr.sin_family = AF_INET;     addr.sin_port = htons(port);     addr.sin_addr.s_addr = htonl(INADDR_ANY);     ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr));     if (ret != 0) {         perror("CWMP bind:");         return -2;     }      return fd; }  /* 命令格式：main serv-addr  * 输出设备的ip地址 */ int main(int argc, char **argv) {     int fd;     struct sockaddr_in serv_addr;     struct sockaddr_in out_addr;     socklen_t address_len;     int ret;      printf("test starting..\n");      if (argc < 2) {         printf("please input server's address\n");         exit(1);     }      fd = create_socket(9999);     if (fd < 0) {         exit(1);     }     printf("create ok fd = %d\n", fd);      bzero(&serv_addr, sizeof(serv_addr));     serv_addr.sin_addr.s_addr = inet_addr(argv[1]);     serv_addr.sin_port = htons(80);     serv_addr.sin_family = AF_INET;     ret = connect(fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));     if (ret != 0) {         perror("CWMP connect:");         exit(1);     }     printf("connetc ok\n");      address_len = sizeof(out_addr);     ret = getsockname(fd, (struct sockaddr *)&out_addr, (socklen_t *)&address_len);     if (ret != 0) {         perror("CWMP get name:");     }     printf("get ok\n");      printf("addr=%s\n", inet_ntoa(out_addr.sin_addr));      close(fd);      exit(0); }

user: user-0
content: 引用 13 楼 qq_22134911 的回复:getsockname可以获得一个socket的本端绑定IP，前提是你已经向对端发过任意的包(包括连接） 这种方法应该可以，先连接一下服务器，再 通过getsockname获取到ip地址，然后在断开连接。我试试看。

user: user-1
content: getsockname可以获得一个socket的本端绑定IP，前提是你已经向对端发过任意的包(包括连接）

user: user-2
content: 引用 楼主 yuahua_hust 的回复:设备有多个ip地址，发送报文的目的地址已知，如何确认设备发送报文时所用的ip地址，linux环境下对应的C接口是什么？谢谢！！  使用bind（）函数。  例子： ... //初始化结构体，并绑定2323端口  my_addr.sin_family = AF_INET;  my_addr.sin_port = htons(2323);  my_addr.sin_addr.s_addr = inet_pton("ip地址");                       //这个地址可以指定具体的ip    //绑定套接口  if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)  {  perror("bind socket error");  exit(1);  }

user: user-3
content: proc/net/route,里面有所有的路由信息，包括mask ，目标等，具体怎么做，这个一两句也说不清楚，你自己找下相关资料吧

user: user-0
content: 引用 6 楼 nice_cxf 的回复:自己去根路由表匹配即可 能具体点吗？使用哪个接口？

user: user-3
content: 自己去根路由表匹配即可

user: user-4
content: 引用 2 楼 yuahua_hust 的回复:上层需要知道是从哪个接口出去的 可以让对方回送的时候，加上IP地址信息

user: user-0
content: 我要实现的功能是： 设备上有多个ip地址，设备会主动连接服务器，但是也存在服务器主动连接设备的情况，这样就需要设备上在连接服务器的时候将连接自身的url发布出去。而我要知道连接自身的url就得先知道去服务器的路由，即从哪个ip地址出去。

user: user-5
content: 这是有路由决定的。

user: user-0
content: 上层需要知道是从哪个接口出去的

user: user-4
content: 不需要制定源地址，从哪个接口发送出去，是由路由表来决定的

user: user-2
content: 引用 10 楼 yuahua_hust 的回复:[quote=引用 9 楼 codeingdog 的回复:] [quote=引用 楼主 yuahua_hust 的回复:] 设备有多个ip地址，发送报文的目的地址已知，如何确认设备发送报文时所用的ip地址，linux环境下对应的C接口是什么？谢谢！！  使用bind（）函数。  例子： ... //初始化结构体，并绑定2323端口  my_addr.sin_family = AF_INET;  my_addr.sin_port = htons(2323);  my_addr.sin_addr.s_addr = inet_pton("ip地址");                       //这个地址可以指定具体的ip    //绑定套接口  if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)  {  perror("bind socket error");  exit(1);  } [/quote] 你没有理解我的问题。[/quote]  那你问的是用c如何获取报文在网络路径吗？获取路由表？

user: user-0
content: 引用 5 楼 xpdavis 的回复:[quote=引用 2 楼 yuahua_hust 的回复:] 上层需要知道是从哪个接口出去的 可以让对方回送的时候，加上IP地址信息[/quote] 双方通信是使用标准协议，服务器有可能是第三方的。能不能不依赖于对方来获取到ip地址

user: user-0
content: 引用 9 楼 codeingdog 的回复:[quote=引用 楼主 yuahua_hust 的回复:] 设备有多个ip地址，发送报文的目的地址已知，如何确认设备发送报文时所用的ip地址，linux环境下对应的C接口是什么？谢谢！！  使用bind（）函数。  例子： ... //初始化结构体，并绑定2323端口  my_addr.sin_family = AF_INET;  my_addr.sin_port = htons(2323);  my_addr.sin_addr.s_addr = inet_pton("ip地址");                       //这个地址可以指定具体的ip    //绑定套接口  if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)  {  perror("bind socket error");  exit(1);  } [/quote] 你没有理解我的问题。