(转载)Linux编程获取本机IP地址的三种方法
(轉(zhuǎn)載)http://blog.csdn.net/jcwKyl/article/details/6324147
這 是一項(xiàng)不太清晰而且沒(méi)有多大意義的工作。一個(gè)原因是網(wǎng)絡(luò)地址的設(shè)置非常靈活而且都是允許用戶進(jìn)行個(gè)性化設(shè)置的,比如一臺(tái)計(jì)算機(jī)上可以有多塊物理網(wǎng)卡或者虛 擬網(wǎng)卡,一個(gè)網(wǎng)卡上可以綁定多個(gè)IP地址,用戶可以為網(wǎng)卡設(shè)置別名,可以重命名網(wǎng)卡,用戶計(jì)算機(jī)所在網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)未知,主機(jī)名設(shè)置是一個(gè)可選項(xiàng)并且同樣可 以為一個(gè)計(jì)算機(jī)綁定多個(gè)主機(jī)名等,這些信息都會(huì)有影響。脫離了網(wǎng)絡(luò)連接,單獨(dú)的網(wǎng)絡(luò)地址沒(méi)有任何意義。編程中遇到必須獲取計(jì)算機(jī)IP的場(chǎng)景,應(yīng)該考慮將這 一選項(xiàng)放到配置文件中,由用戶自己來(lái)選擇。
通過(guò)google,編程獲取IP地址大約有以下三種思路:
1. 通過(guò)gethostname()和gethostbyname()
#include <stdio.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main() {
??? char hname[128];
??? struct hostent *hent;
??? int i;
??? gethostname(hname, sizeof(hname));
??? //hent = gethostent();
??? hent = gethostbyname(hname);
??? printf("hostname: %s/naddress list: ", hent->h_name);
??? for(i = 0; hent->h_addr_list[i]; i++) {
??????? printf("%s/t", inet_ntoa(*(struct in_addr*)(hent->h_addr_list[i])));
??? }
??? return 0;
}
運(yùn)行:
[whb@jcwkyl c]$ ./local_ip?
hostname: jcwkyl.jlu.edu.cn
address list: 10.60.56.90???????
2. 通過(guò)枚舉網(wǎng)卡,API接口可查看man 7 netdevice
/*代碼來(lái)自StackOverflow: http://stackoverflow.com/questions/212528/linux-c-get-the-ip-address-of-local-computer */
#include <stdio.h>??????
#include <sys/types.h>
#include <ifaddrs.h>
#include <netinet/in.h>?
#include <string.h>?
#include <arpa/inet.h>
int main (int argc, const char * argv[]) {
??? struct ifaddrs * ifAddrStruct=NULL;
??? void * tmpAddrPtr=NULL;
??? getifaddrs(&ifAddrStruct);
??? while (ifAddrStruct!=NULL) {
??????? if (ifAddrStruct->ifa_addr->sa_family==AF_INET) { // check it is IP4
??????????? // is a valid IP4 Address
??????????? tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;
??????????? char addressBuffer[INET_ADDRSTRLEN];
??????????? inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
??????????? printf("%s IP Address %s/n", ifAddrStruct->ifa_name, addressBuffer);?
??????? } else if (ifAddrStruct->ifa_addr->sa_family==AF_INET6) { // check it is IP6
??????????? // is a valid IP6 Address
??????????? tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;
??????????? char addressBuffer[INET6_ADDRSTRLEN];
??????????? inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
??????????? printf("%s IP Address %s/n", ifAddrStruct->ifa_name, addressBuffer);?
??????? }?
??????? ifAddrStruct=ifAddrStruct->ifa_next;
??? }
??? return 0;
}
運(yùn)行 :
[whb@jcwkyl c]$ ./local_ip2?
lo IP Address 127.0.0.1
eth0 IP Address 10.60.56.90
eth0:1 IP Address 192.168.1.3
lo IP Address ::
eth0 IP Address ::2001:da8:b000:6213:20f:1fff
eth0 IP Address 0:0:fe80::20f:1fff
3. 打開(kāi)一個(gè)對(duì)外界服務(wù)器的網(wǎng)絡(luò)連接,通過(guò)getsockname()反查自己的IP
轉(zhuǎn)載于:https://www.cnblogs.com/Robotke1/archive/2013/05/03/3055764.html
總結(jié)
以上是生活随笔為你收集整理的(转载)Linux编程获取本机IP地址的三种方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux网卡命名规则
- 下一篇: 计算行程