如何在C中获取我的非环回网络IP地址?
发布时间:2020-12-16 10:49:57 所属栏目:百科 来源:网络整理
导读:对于两台主机之间的通信,我需要将主机的IP地址发送到另一个站点.问题是,如果我请求我的IP地址,可能是我恢复了我的本地环回IP地址(127.x.x.x),而不是网络(以太网)IP地址. 我使用以下代码: char myhostname[32];gethostname(myhostname,32);hp = gethostbynam
对于两台主机之间的通信,我需要将主机的IP地址发送到另一个站点.问题是,如果我请求我的IP地址,可能是我恢复了我的本地环回IP地址(127.x.x.x),而不是网络(以太网)IP地址.
我使用以下代码: char myhostname[32]; gethostname(myhostname,32); hp = gethostbyname(myhostname); unsigned my_ip = *(unsigned*)(hp->h_addr); if( (my_ip % 256) == 127) { /* Wrong IP adress as it's 127.x.x.x */ printf("Error,local IP address!"); return; } 解决它的唯一方法是确保/ etc / hosts中的主机名是在真实网络地址后面,而不是本地环回(例如Ubuntu的默认值). 有没有办法解决这个问题而不依赖于/ etc / hosts的内容? 编辑:我改变了上面的代码,所以它使用getaddrinfo,但我仍然得到回送设备的号码(127.0,1)而不是真正的IP地址: struct addrinfo hint = {0}; struct addrinfo *aip = NULL; unsigned ip = 0; struct sockaddr_in *sinp = NULL; hint.ai_family = AF_INET; /* IPv4 */ hint.ai_socktype = SOCK_STREAM; if(getaddrinfo(hostname,NULL,&hint,&aip) != 0) { return 0; } sinp = (struct sockaddr_in *) aip->ai_addr; ip = *(unsigned *) &sinp->sin_addr; (我曾经用三个SOCK_STREAM,SOCK_DGRAM和SOCK_RAW取回了3个addrinfo的列表,但提示阻止了这个) 所以我的问题仍然存在…… 解决方法
POSIX函数getaddrinfo()返回给定主机名的地址链表,因此您只需要查看该列表并找到非环回地址.
见man getaddrinfo. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 【Postgresql】postgresql9.3.9版本基于流复制方式双机热备
- ruby-on-rails – 帮助为静态页面创建路由和控制器
- ios – 如何在UITableViewCell中获取UIButton的indexPath?
- 反应可可 – 在ReactiveCocoa/libextobjc中如何弱化和强化工
- Ajax安装方法
- SQLite 3.7.13的加密解密(三)―― 创建加密解密函数
- Ruby` when’关键字在case语句中不使用==.它有什么用?
- 源码安装postgresql9.5.1
- ios – 错误:Bundle只包含bitcode-marker
- Cocos2d-x 3.11.1 Android Windows 10 加载csd