最近在ubuntu上写FTP服务器时封装了getlocalIP来获取本机IP,函数内部使用gethostname()获取主机名,使用gethostbyname()来获取主机IP列表,但是用该函数获取的ip绑定socket去使用connect方法时会失败,errno代码为22,invalid argument,打印输出获取的ip,发现获取的ip为127.0.1.1。经查询文档,gethostbyname()会去解析/etc/hosts文件来获取ip,查看该文件发现里面只有两行1.127.0.0.1 localhost 2.127.1.1.1 主机名 ,所以根据主机名来获取IP会返回127.0.1.1,与用ifconfig查看到的ip不相等。搜索了一下,网上有其他人遇到了此问题,可以通过解析/etc/sysconfig/network-scripts目录下的ifcfg-eth0等网卡配置文件来读取真实IP,但是ubuntu没有该目录,经过查阅资料,可以使用ioctl读取网卡信息获取IP,终端下输入 man netdevice
主要有两个结构体,struct ifconf 和 struct ifreq,具体含义由ioctl第二个参数决定,前者保存所有网卡设备得到信息,后者保存网卡接口名称及对应的IP地址等信息,ioctl函数原型如下:
int ioctl(int d, int request, ...);
第二个参数为设定的动作,与网络相关的参数如下(来自百度百科):
类别
|
Request
|
说明
|
数据类型
|
套
接
口
|
SIOCATMARK
SIOCSPGRP
SIOCGPGRP
|
是否位于带外标记
设置套接口的进程ID 或进程组ID
获取套接口的进程ID 或进程组ID
|
int
|