正在阅读:

linux服务器获取IP地址方式

399

一. 目的

总结linux服务器调获取ip地址各种该方法。

二. 总结

1.  socket

getsockname()获取本地IP地址

如果建立TCP,UDP连接的情况下

(UDP无法获取对端的信息,而且TCP情况下获取地址属性family注意,

要看本地绑定的协议族是啥,有些IPV4和IPV6都绑定的是AF_INT6 -hikvision)

可以通过getsockname和getpeername函数来获取本地和对端的IP和端口号

2.  gethostbyname

函数:gethostname()

功能:gethostname()和getaddrinfo()的功能类似

 一般用于通过主机名或者服务名,比如域名来获取主机的IP地址.

但是要想获取本地IP地址的时候,一般获取的是回环地址127.0.0.1

注意,主机的地址是一个列表的形式,原因是当一个主机有多个网络接口时,

及多块网卡或者一个网卡绑定多个IP地址时,自然就有多个IP地址.

以上代码获取的是根据主机名称得到的第一个IP地址.

 
 

3.  getifaddrs

getifaddrs()获取本地IP地址

查找到系统所有的网络接口的信息,包括以太网卡接口和回环接口等

glibc的源码,它是利用netlink来实现的,

所以在使用这个接口的时候一定要确保你的内核支持netlink.

注意: 过滤掉 ifa_flags & (IFF_LOOPBACK | IFF_SLAVE)

struct ifaddrs

{

struct ifaddrs *ifa_next; // Pointer to the next structure.

char *ifa_name; // Name of this network interface.

unsigned int ifa_flags; // Flags as from SIOCGIFFLAGS ioctl.

struct sockaddr *ifa_addr; // Network address of this interface.

struct sockaddr *ifa_netmask; // Netmask of this interface.

union

{

//At most one of the following two is valid. If the IFF_BROADCAST

// bit is set in `ifa_flags', then `ifa_broadaddr' is valid. If the

//IFF_POINTOPOINT bit is set, then `ifa_dstaddr' is valid.

// It is never the case that both these bits are set at once.

struct sockaddr *ifu_broadaddr; //Broadcast address of this interface.

struct sockaddr *ifu_dstaddr; // Point-to-point destination address.

} ifa_ifu;

//ese very same macros are defined by <net/if.h> for `struct ifaddr'.

//So if they are defined already, the existing definitions will be fine.

# ifndef ifa_broadaddr

# define ifa_broadaddr ifa_ifu.ifu_broadaddr

# endif

# ifndef ifa_dstaddr

# define ifa_dstaddr ifa_ifu.ifu_dstaddr

# endif

void *ifa_data; //Address-specific data (may be unused).

};

4.  socket - ioctl

ioctl()获取本地IP地址

Linux 下 可以使用ioctl()函数以及结构体

struct ifreq和结构体struct ifconf来获取网络接口的各种信息。

具体过程是先通过ictol获取本地的所有接口信息,存放到ifconf结构中

再从其中取出每个ifreq表示的ip信息(一般每个网卡对应一个IP地址,

如:”eth0…、eth1…”)。

先了解结构体 struct ifreq和结构体struct ifconf:

ifconf通常是用来保存所有接口信息的

头文件if.h

struct ifconf

{

     int ifc_len; // size of buffer

     union

{

char *ifcu_buf; //input from user->kernel

struct ifreq *ifcu_req; // return from kernel->user

} ifc_ifcu;

};

#define ifc_buf ifc_ifcu.ifcu_buf //buffer address

#define ifc_req ifc_ifcu.ifcu_req //array of structures

//ifreq用来保存某个接口的信息

//if.h

struct ifreq {

char ifr_name[IFNAMSIZ];

union {

struct sockaddr ifru_addr;

struct sockaddr ifru_dstaddr;

struct sockaddr ifru_broadaddr;

short ifru_flags;

int ifru_metric;

caddr_t ifru_data;

} ifr_ifru;

};

#define ifr_addr ifr_ifru.ifru_addr

#define ifr_dstaddr ifr_ifru.ifru_dstaddr

#define ifr_broadaddr ifr_ifru.ifru_broadaddr

5.  getaddrinfo

getaddrinfo()获取本地IP地址

注意:getaddrinfo()可以完成网络主机中主机名和服务名到地址的映射,

但是一般不能用来获取本地IP地址,当它用来获取本地IP地址时,

返回的一般是127.0.0.1本地回环地址。

留下脚印,证明你来过。

*

*

流汗坏笑撇嘴大兵流泪发呆抠鼻吓到偷笑得意呲牙亲亲疑问调皮可爱白眼难过愤怒惊讶鼓掌
关闭