linux 获取本地ip

#include <stdio.h> 
#include <string.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <net/if.h> 
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>

#define IF_NAME "wlan0"
#define rcvBufSize 50


#define PING_CMD	"/bin/ping -c 1 -W 1 %s > %s"
#define TMP_PING_PATH	"/tmp/pingInternet"
#define RECV1ICMPPKT	"1 packets received"

#define TMP_WIFI_STA_PATH	"/tmp/wifistatus"

char Gateway_Ip[32] = {0};

char wifi_sta_conn_wr_protect = 0;
char wifi_sta_disconn_wr_protect = 0;
/*
get_local_ip:获取本地IP
ifname:WiFi名
IP:IP地址
*/
int get_local_ip(char * ifname, char * ip)
{
	char rcvBuf[rcvBufSize] = {0};
	char *temp = NULL;
	int inet_sock;
	struct ifreq ifr;
	inet_sock = socket (AF_INET, SOCK_DGRAM, 0);
	
	memset(ifr.ifr_name, 0, sizeof(ifr.ifr_name));
	memcpy(ifr.ifr_name, ifname, strlen(ifname));
	if(0 != ioctl(inet_sock, SIOCGIFADDR, &ifr))
	{
		printf("ioctl error\r\n");
		return -1;
	}
	temp = inet_ntoa(((struct sockaddr_in*)&(ifr.ifr_addr))->sin_addr); 
	memcpy(ip, temp, strlen(temp));
	close(inet_sock);
		
	return 0;
}

void Local_Ip_Parsing(void)
{
	char Local_Ip[32] = {0};
	
	char *subString;
	char *subStringNext;
	
    char seg1[4] = {"0"},seg2[4] = {"0"},seg3[4] = {"0"},seg4[4] = {"0"};
    
    
	get_local_ip(IF_NAME, Local_Ip);
	
	if(0 != strcmp(Local_Ip, ""))
	{
		printf("%s ip is %s\n",IF_NAME, Local_Ip);
		
		subString = Local_Ip;	
		for (char i = 0 ; i < 3 ; i++)
		{
			if ((subStringNext = strstr(subString, ".")) != NULL)
			{
				switch(i)
				{
					case 0:memcpy(seg1, subString, subStringNext - subString);break;
					case 1:memcpy(seg2, subString, subStringNext - subString);break;
					case 2:memcpy(seg3, subString, subStringNext - subString);break;	
				}
				subString = subStringNext;
			}	
			subString++;
		}
		snprintf(Gateway_Ip, sizeof(Gateway_Ip), "%s.%s.%s.1",seg1,seg2,seg3);
		printf("Gateway_Ip is %s\n", Gateway_Ip);
	}
}



/*
ping网关测试
连接成功返回0;连接失败返回-1
*/
static int check_internet_ping(char * gateway_addr)
{
	char pingCMD[128]={0};
	char tmpBuf[256]={0};
	FILE *pfile = NULL;
	FILE *pfile_wifista = NULL;
	
	snprintf(pingCMD, sizeof(pingCMD), PING_CMD, gateway_addr, TMP_PING_PATH); /*ping GLOBAL gateway*/
	///printf("pingCMD=%s!\n", pingCMD);
	system(pingCMD);
	if((pfile = fopen(TMP_PING_PATH, "rb")) != NULL) 
	{
		fread(tmpBuf, sizeof(tmpBuf), 1, pfile);
		fclose(pfile);
	}
	else 
	{
		printf("open ping file error!\n");
	}
	if(strstr(tmpBuf, RECV1ICMPPKT)) 
	{ 
		/*ping success connect*/
		printf("connect!\n");
		if(!wifi_sta_conn_wr_protect)
		{					
			if((pfile_wifista = fopen(TMP_WIFI_STA_PATH, "wb")) != NULL) 
			{
				fwrite((char *)"1", 1, 1, pfile_wifista);
				fclose(pfile_wifista);
				wifi_sta_disconn_wr_protect = 0;
				wifi_sta_conn_wr_protect =1;
				printf("write 1 !\n");	
			}
		}
		return 0;
	} 
	else
	{
		/*ping fail  disconnect*/
		printf("disconnect !\n");
		if(!wifi_sta_disconn_wr_protect)
		{
			if((pfile_wifista = fopen(TMP_WIFI_STA_PATH, "wb")) != NULL) 
			{
				fwrite((char *)"0", 1, 1, pfile_wifista);
				fclose(pfile_wifista);
				wifi_sta_conn_wr_protect = 0;
				wifi_sta_disconn_wr_protect =1;		
				printf("write 0 !\n");		
			}
		}
		return -1;
	}
}



int main(void)
{
	Local_Ip_Parsing();//初始化的时候调用一次即可
	while(1)
	{
		check_internet_ping(Gateway_Ip);
		sleep(1);
	}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿木小呆呆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值