java版
private InetAddress getLocalIp() throws SocketException{
Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
while(e.hasMoreElements()){
NetworkInterface ni = e.nextElement();
if("eth0".equals(ni.getName())){
Enumeration<InetAddress> e2 = ni.getInetAddresses();
while (e2.hasMoreElements()) {
InetAddress ia = e2.nextElement();
if (ia instanceof Inet4Address){
return ia;
}
}
}
}
return null;
}
python版:
import socket
import fcntl
import struct
def get_ip_address(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915, # SIOCGIFADDR
struct.pack('256s', ifname[:15])
)[20:24])
print get_ip_address('eth0')
c版:
#include <stdio.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <net/if.h>
// 根据传入的网卡名,查询相应的ip,比如eth0,wlan0
char* get_ip(const char *inter_name){
int s;
struct ifconf conf;
struct ifreq *ifr;
char buff[BUFSIZ];
int num, i;
size_t l;
s = socket(PF_INET, SOCK_DGRAM, 0);
conf.ifc_len = BUFSIZ;
conf.ifc_buf = buff;
ioctl(s, SIOCGIFCONF, &conf);
num = conf.ifc_len / sizeof(struct ifreq);
ifr = conf.ifc_req;
for(i=0; i<num; i++){
struct sockaddr_in *sin = (struct sockaddr_in *)(&ifr->ifr_addr);
ioctl(s, SIOCGIFFLAGS, ifr);
if(
((ifr->ifr_flags & IFF_LOOPBACK) == 0)
&& (ifr->ifr_flags & IFF_UP)
){
if(strcmp(ifr->ifr_name, inter_name) == 0){
return inet_ntoa(sin->sin_addr);
}
}
ifr++;
}
// 没有查询到相应的网卡的ip
return NULL;
}
int main(int argc, char **argv){
const char *s = get_ip(argv[1]);
if(s != NULL)
printf("%s\n", s);
else
printf("the interface doesn't exist\n");
}
lua版:
采用c模块实现,使用上面c版的代码。
#include <stdio.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
static int get_ip(lua_State *L){
int s;
struct ifconf conf;
struct ifreq *ifr;
char buff[BUFSIZ];
int num, i;
size_t l;
const char *inter_name;
s = socket(PF_INET, SOCK_DGRAM, 0);
conf.ifc_len = BUFSIZ;
conf.ifc_buf = buff;
ioctl(s, SIOCGIFCONF, &conf);
num = conf.ifc_len / sizeof(struct ifreq);
ifr = conf.ifc_req;
inter_name = lua_tolstring(L, -1, &l);
for(i=0; i<num; i++){
struct sockaddr_in *sin = (struct sockaddr_in *)(&ifr->ifr_addr);
ioctl(s, SIOCGIFFLAGS, ifr);
if(
((ifr->ifr_flags & IFF_LOOPBACK) == 0)
&& (ifr->ifr_flags & IFF_UP)
){
if(strcmp(ifr->ifr_name, inter_name) == 0){
lua_pushstring(L, inet_ntoa(sin->sin_addr));
return 1;
}
}
ifr++;
}
// 没有查询到相应的网卡的ip
lua_pushstring(L, "null");
return 1;
}
static const struct luaL_Reg iplib[] = {
{"get_ip", get_ip},
{NULL, NULL}
};
int luaopen_iplib(lua_State *L){
luaL_register(L, "iplib", iplib);
return 1;
}
然后编译成动态链接库:
gcc -fpic -shared -I <path-to-lua-include> -o iplib.so iplib.c
指定iplib.so在LUA_CPATH下,在lua中可以这样使用:
local ip = require('iplib')
ip_addr = ip.get_ip('eth0')
print(ip_addr)