新聞中心
在網(wǎng)絡(luò)編程中,獲取本機或遠程主機的IP地址是一個很常見的需求。Linux操作系統(tǒng)提供了一系列的接口函數(shù),可以方便地實現(xiàn)這些功能。

10年建站經(jīng)驗, 成都網(wǎng)站制作、做網(wǎng)站客戶的見證與正確選擇。創(chuàng)新互聯(lián)提供完善的營銷型網(wǎng)頁建站明細(xì)報價表。后期開發(fā)更加便捷高效,我們致力于追求更美、更快、更規(guī)范。
1. 獲取本機IP地址
在Linux中,獲取本機IP地址最“原始”的方法是通過讀取系統(tǒng)文件/sys/class/net/eth0/address。這個文件中保存有網(wǎng)卡的MAC地址,通過分析MAC地址可以得到本機的IP地址。不過這種方式比較麻煩,并且只適用于有線網(wǎng)絡(luò)環(huán)境下的情況。
更常用的方法是使用getifaddrs()函數(shù)獲取本機網(wǎng)絡(luò)信息。這個函數(shù)的之一個參數(shù)是一個指向ifaddrs結(jié)構(gòu)體的指針,第二個參數(shù)是一個標(biāo)識IP協(xié)議族類型的常量。如果需要獲取IPv4地址,可以將第二個參數(shù)設(shè)置為AF_INET,如果需要獲取IPv6地址,則可以將其設(shè)置為AF_INET6。以下是一個獲取本機IPv4地址的示例代碼:
“`
#include
#include
#include
#include
#include
int mn()
{
struct ifaddrs *ifaddr, *ifa;
int family, s;
char host[NI_MAXHOST];
if (getifaddrs(&ifaddr) == -1) {
perror(“getifaddrs”);
exit(EXIT_FLURE);
}
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr == NULL)
continue;
family = ifa->ifa_addr->sa_family;
if (family == AF_INET) {
s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
if (s != 0) {
printf(“getnameinfo() fled: %s”, g_strerror(s));
exit(EXIT_FLURE);
}
printf(“%s: %s\n”, ifa->ifa_name, host);
}
}
freeifaddrs(ifaddr);
exit(EXIT_SUCCESS);
}
“`
這個程序會遍歷本機所有的網(wǎng)絡(luò)接口,并打印出每個接口對應(yīng)的IP地址。
2. 獲取遠程主機IP地址
獲取遠程主機IP地址的方法比較簡單??梢允褂胓etaddrinfo()函數(shù)將主機名轉(zhuǎn)換成IP地址。這個函數(shù)的之一個參數(shù)是主機名,第二個參數(shù)是服務(wù)名,可以為NULL。第三個參數(shù)是一個指向Addrinfo結(jié)構(gòu)體的指針,用于返回地址信息。以下是一個獲取百度IP地址的示例代碼:
“`
#include
#include
#include
int mn(int argc, char *argv[])
{
struct addrinfo hints, *res, *p;
int status;
char ipstr[INET6_ADDRSTRLEN];
if (argc != 2) {
fprintf(stderr,”usage: showip hostname\n”);
return 1;
}
memset(&hints, 0, sizeof hints);
hints._family = AF_UNSPEC; // set to AF_INET to force IPv4
hints._socktype = SOCK_STREAM;
if ((status = getaddrinfo(argv[1], NULL, &hints, &res)) != 0) {
fprintf(stderr, “getaddrinfo: %s\n”, g_strerror(status));
return 2;
}
printf(“IP addresses for %s:\n\n”, argv[1]);
for(p = res;p != NULL; p = p->_next) {
void *addr;
char *ipver;
// get the pointer to the address itself,
// different fields in IPv4 and IPv6:
if (p->_family == AF_INET) { // IPv4
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->_addr;
addr = &(ipv4->sin_addr);
ipver = “IPv4”;
} else { // IPv6
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->_addr;
addr = &(ipv6->sin6_addr);
ipver = “IPv6”;
}
// convert the IP to a string and print it:
inet_ntop(p->_family, addr, ipstr, sizeof ipstr);
printf(” %s: %s\n”, ipver, ipstr);
}
freeaddrinfo(res); // free the linked list
return 0;
}
“`
這個程序會將百度的域名“www.bdu.com”轉(zhuǎn)換成對應(yīng)的IP地址,并打印出來??梢钥吹剑瑢τ贗Pv4和IPv6兩種地址,地址轉(zhuǎn)換的方式是不同的。
相關(guān)問題拓展閱讀:
- linux下怎么獲取當(dāng)前能連上網(wǎng)的那個ip地址
linux下怎么獲取當(dāng)前能連上網(wǎng)的那個ip地址
沒交待清楚,linux是宿主機?
打開一個終端,運行 ifconfig ,ppp0的ip地址就是你的3G網(wǎng)卡的聯(lián)網(wǎng)地址。
執(zhí)行一個腳本即可。
#!/bin/bash
#purpose: show internet local ip
Net_Card=`route |grep default|awk 薯桐'{print $NF}’`
Inter_Ip=`ifconfig $Net_Card |grep ‘inet addr’|awk -F: ‘{print $2}’|awk ‘{print $1}’|head -n1`
echo “IP:$Inter_Ip”
###new way
#!/bin/bash
#purpose: show local IP and outer IP
export PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/in:/usr/in:/in:/opt/java/jdk/bin:
NET_CARD=”$(route|awk ‘?dāng)?shù)灶坦/default/{print $NF}’)”
LOCAL_IP=”$(ip a|awk -F ‘+’ ‘/\s*inet.*global/&&/'”${NET_CARD}”‘/{print$3}’|head -1)”
##require internet
OUTER_IP=”$(curl 辯缺-s ifconfig.co)”
echo “LOCALIP:${LOCAL_IP} — OUTERIP=${OUTER_IP}”
linux c編程 獲取ip地址的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于linux c編程 獲取ip地址,如何使用Linux C編程獲取IP地址,linux下怎么獲取當(dāng)前能連上網(wǎng)的那個ip地址的信息別忘了在本站進行查找喔。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
網(wǎng)頁名稱:如何使用LinuxC編程獲取IP地址(linuxc編程獲取ip地址)
分享網(wǎng)址:http://www.dlmjj.cn/article/ccespph.html


咨詢
建站咨詢
