1,python:
python -c 'import socket;s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM);s.connect(("www.baidu.com",0));print s.getsockname()[0]'
2, dig 命令:
dig +noall +answer www.baidu.com | head -n 1 | cut -d $'\t' -f 5 | xargs ip route get | head -n 1 | awk -F ' ' '{print $NF}'
3,ioctl函数(需要和网卡绑定):
使用方法:std::string g_ip;
get_local_host("eth0",g_ip);
int get_local_host(const std::string &card,std::string& localip) { int retval = -1; int sock = -1; sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == -1) { return retval; } struct ifreq ifr_ip; memset(&ifr_ip, 0, sizeof(ifr_ip)); strncpy(ifr_ip.ifr_name, card.c_str(), sizeof(ifr_ip.ifr_name) - 1); retval = ioctl(sock, SIOCGIFADDR, &ifr_ip); if (retval < 0) { close(sock); return retval; } char ip_addr[64] = {0}; struct sockaddr_in *sin; sin = (struct sockaddr_in *)&ifr_ip.ifr_addr; strcpy(ip_addr, inet_ntoa(sin->sin_addr)); localip = std::string(ip_addr); close(sock); return retval; }
4,
gethostbyname & getsockname函数
void get_local_ip (std::string & ip_addr) { struct hostent *hptr = gethostbyname("www.baidu.com"); if (hptr == NULL) { printf("gethostbyname error for host: www.baidu.com : %s\n", hstrerror(h_errno)); return ; } char str[INET_ADDRSTRLEN] = {0}; switch (hptr->h_addrtype) { case AF_INET: inet_ntop(hptr->h_addrtype, hptr->h_addr, str, sizeof(str)); break; default: printf("unknown address type\n"); break; } int fd = socket (AF_INET, SOCK_DGRAM, 0); socklen_t len = sizeof (struct sockaddr); struct sockaddr_in saddr; struct sockaddr_in name; /* Fake server. */ memset (&saddr, 0, sizeof (struct sockaddr)); saddr.sin_family = AF_INET; saddr.sin_port = htons (1234); inet_aton (str, &saddr.sin_addr); int ret = connect (fd, (struct sockaddr *)&saddr, len); if (ret == -1) { printf ("Connect fail.\n"); goto out; } ret = getsockname (fd, (struct sockaddr *)&name, &len); if (ret == -1) { printf ("Get socket name fail.\n"); goto out; } ip_addr = inet_ntoa(name.sin_addr); printf ("Local IP : %s\n", ip_addr.c_str()); out: close (fd); return ; }