设备有多个ip地址,发送报文的目的地址已知,如何确认设备发送报文时所用的ip地址,linux环境下对应的C接口是什么?谢谢!!

_任我行_ 2014-10-17 10:28:09
设备有多个ip地址,发送报文的目的地址已知,如何确认设备发送报文时所用的ip地址,linux环境下对应的C接口是什么?谢谢!!
...全文
517 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
_任我行_ 2014-10-21
  • 打赏
  • 举报
回复
搞定了 #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); }
_任我行_ 2014-10-20
  • 打赏
  • 举报
回复
引用 13 楼 qq_22134911 的回复:
getsockname可以获得一个socket的本端绑定IP,前提是你已经向对端发过任意的包(包括连接)
这种方法应该可以,先连接一下服务器,再 通过getsockname获取到ip地址,然后在断开连接。我试试看。
qq_22134911 2014-10-18
  • 打赏
  • 举报
回复
getsockname可以获得一个socket的本端绑定IP,前提是你已经向对端发过任意的包(包括连接)
小猫咪可馋了 2014-10-17
  • 打赏
  • 举报
回复
引用 楼主 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); }
nice_cxf 2014-10-17
  • 打赏
  • 举报
回复
proc/net/route,里面有所有的路由信息,包括mask ,目标等,具体怎么做,这个一两句也说不清楚,你自己找下相关资料吧
_任我行_ 2014-10-17
  • 打赏
  • 举报
回复
引用 6 楼 nice_cxf 的回复:
自己去根路由表匹配即可
能具体点吗?使用哪个接口?
nice_cxf 2014-10-17
  • 打赏
  • 举报
回复
自己去根路由表匹配即可
铖邑 2014-10-17
  • 打赏
  • 举报
回复
引用 2 楼 yuahua_hust 的回复:
上层需要知道是从哪个接口出去的
可以让对方回送的时候,加上IP地址信息
_任我行_ 2014-10-17
  • 打赏
  • 举报
回复
我要实现的功能是: 设备上有多个ip地址,设备会主动连接服务器,但是也存在服务器主动连接设备的情况,这样就需要设备上在连接服务器的时候将连接自身的url发布出去。而我要知道连接自身的url就得先知道去服务器的路由,即从哪个ip地址出去。
ForestDB 2014-10-17
  • 打赏
  • 举报
回复
这是有路由决定的。
_任我行_ 2014-10-17
  • 打赏
  • 举报
回复
上层需要知道是从哪个接口出去的
铖邑 2014-10-17
  • 打赏
  • 举报
回复
不需要制定源地址,从哪个接口发送出去,是由路由表来决定的
小猫咪可馋了 2014-10-17
  • 打赏
  • 举报
回复
引用 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如何获取报文在网络路径吗?获取路由表?
_任我行_ 2014-10-17
  • 打赏
  • 举报
回复
引用 5 楼 xpdavis 的回复:
[quote=引用 2 楼 yuahua_hust 的回复:] 上层需要知道是从哪个接口出去的
可以让对方回送的时候,加上IP地址信息[/quote] 双方通信是使用标准协议,服务器有可能是第三方的。能不能不依赖于对方来获取到ip地址
_任我行_ 2014-10-17
  • 打赏
  • 举报
回复
引用 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] 你没有理解我的问题。

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧