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)