參照網上用ioctl的SIOCGIFCONF方法獲取本地ip成功,代碼如下:
#include <stdio.h>
#include <stdlib.h> /* for exit() */
#include <string.h>
#include <sys/socket.h> /* for socket() */
#include <sys/types.h> /* for socket() */
#include <net/if.h> /* for struct ifreq */
#include <linux/sockios.h> /* for SIOCGIFADDR */
#include <netinet/in.h> /* for struct sockaddr_in */
#include <arpa/inet.h> /* for inet_ntoa() */
int main(int argc, char *argv[])
{
char ipbuf[16];
getlocaip(ipbuf);
printf("local ip is: %s\n", ipbuf);
exit(0);
}
int getlocaip(char *ip)
{
int sockfd;
struct ifreq req;
struct sockaddr_in *host;
if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
return -1;
}
bzero(&req, sizeof(struct ifreq));
strcpy(req.ifr_name, "eth0");
ioctl(sockfd, SIOCGIFADDR, &req);
host = (struct sockaddr_in*)&req.ifr_addr;
strcpy(ip, inet_ntoa(host->sin_addr));
close(sockfd);
return 0;
}
因爲頭文件是後來一個個的加上去的,所以在嘗試的過程中,編譯的時候出現很多錯誤,雖然都是比較常見的,也記錄一下:
1.出現警告:
警告:
傳遞‘strcpy’的第 2
個參數時將整數賦給指針,未作類型轉換
原因:沒有把inet_ntoa()函數的頭文件加上
解決方法:加上頭文件 #include <arpa/inet.h>
2.出現錯誤:
錯誤: 提領指向不完全類型的指針
原因:這種錯誤主要是因爲使用的結構體定義的頭文件沒有包含進來,我這主要是忘了把定義struct sockaddr_in的頭文件
解決方法:加上結構體對應的頭文件(我的是#include <netinet/in.h>)
3.執行程序打印的ip是0.0.0.0
原因:計算機網卡eth0沒有獲取到ip,可以用ifconfig看下:
解決方法:用ifconfig手動設置ip後再執行程序:
搞定碎覺!