Linux下使用ioctl获取本地接口IP

本文介绍了在Ubuntu上编写FTP服务器时遇到的问题,即使用gethostbyname()获取的IP无法用于socket连接,原因是它返回的是127.0.1.1。通过研究,发现可以利用ioctl函数来获取更可靠的网卡IP信息,该方法适用于不依赖/etc/hosts和/etc/sysconfig/network-scripts的情况。ioctl允许操作和查询设备状态,包括获取网络设备的IP地址。
摘要由CSDN通过智能技术生成

最近在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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值