獲取本機ip(成功版)

參照網上用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後再執行程序:

 

 


搞定碎覺!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章