⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ipset.c

📁 此程序实现在Linux下对ARM板子进行IP设置。可以调用此程序改变IP地址
💻 C
字号:
#include <sys/time.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <net/if_arp.h> 
#include <asm/types.h>
#include <netinet/ether.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <stdlib.h>
static char ipdz[16]="202.119.18.119";
static char zwym[16]="255.255.255.0";
static char mrwg[16]="202.119.18.3";
static char serverip[16]={0};

#define BUFSIZE 8192
#define PORTNUM 8001
struct route_info
{
	u_int dstAddr;
	u_int srcAddr;
	u_int gateWay;
	char ifName[IF_NAMESIZE];
};
int readNlSock(int sockFd, char *bufPtr, int seqNum, int pId)
{
	struct nlmsghdr *nlHdr;
	int readLen = 0, msgLen = 0;
	do{
		//收到内核的应答
		if((readLen = recv(sockFd, bufPtr, BUFSIZE - msgLen, 0)) < 0)
		{
			perror("SOCK READ: ");
			return -1;
		}

		nlHdr = (struct nlmsghdr *)bufPtr;
		//检查header是否有效
		if((NLMSG_OK(nlHdr, readLen) == 0) || (nlHdr->nlmsg_type == NLMSG_ERROR))
		{
			perror("Error in recieved packet");
			return -1;
		}

		/* Check if the its the last message */
		if(nlHdr->nlmsg_type == NLMSG_DONE) 
		{
			break;
		}
		else
		{
			/* Else move the pointer to buffer appropriately */
			bufPtr += readLen;
			msgLen += readLen;
		}

		/* Check if its a multi part message */
		if((nlHdr->nlmsg_flags & NLM_F_MULTI) == 0) 
		{
			/* return if its not */
			break;
		}
	} while((nlHdr->nlmsg_seq != seqNum) || (nlHdr->nlmsg_pid != pId));
	return msgLen;
}

//分析返回的路由信息
void parseRoutes(struct nlmsghdr *nlHdr, struct route_info *rtInfo,char *gateway)
{
	struct rtmsg *rtMsg;
	struct rtattr *rtAttr;
	int rtLen;
	char *tempBuf = NULL;
	//2007-12-10
	struct in_addr dst;
	struct in_addr gate;

	tempBuf = (char *)malloc(100);
	rtMsg = (struct rtmsg *)NLMSG_DATA(nlHdr);
	// If the route is not for AF_INET or does not belong to main routing table
	//then return. 
	if((rtMsg->rtm_family != AF_INET) || (rtMsg->rtm_table != RT_TABLE_MAIN))
		return;
	/* get the rtattr field */
	rtAttr = (struct rtattr *)RTM_RTA(rtMsg);
	rtLen = RTM_PAYLOAD(nlHdr);
	for(;RTA_OK(rtAttr,rtLen);rtAttr = RTA_NEXT(rtAttr,rtLen)){
		switch(rtAttr->rta_type) {
	case RTA_OIF:
		if_indextoname(*(int *)RTA_DATA(rtAttr), rtInfo->ifName);
		break;
	case RTA_GATEWAY:
		rtInfo->gateWay = *(u_int *)RTA_DATA(rtAttr);
		break;
	case RTA_PREFSRC:
		rtInfo->srcAddr = *(u_int *)RTA_DATA(rtAttr);
		break;
	case RTA_DST:
		rtInfo->dstAddr = *(u_int *)RTA_DATA(rtAttr);
		break;
		}
	}
	dst.s_addr = rtInfo->dstAddr;
	if (strstr((char *)inet_ntoa(dst), "0.0.0.0"))
	{
		gate.s_addr = rtInfo->gateWay;
		sprintf(gateway, (char *)inet_ntoa(gate));
	}
	free(tempBuf);
	return;
}


/********************************************************************
* 函数名: get_gateway
* 参数名: gateway(out)   网关
* 返回值: 0              成功
*          -1             失败
* 功  能:获取本地机的网关
********************************************************************/
int get_gateway(char *gateway)
{
	struct nlmsghdr *nlMsg;
	struct rtmsg *rtMsg;
	struct route_info *rtInfo;
	char msgBuf[BUFSIZE];

	int sock, len, msgSeq = 0;
	//创建 Socket 
	if((sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE)) < 0)
	{
		perror("Socket Creation: ");
		return -1;
	}

	/* Initialize the buffer */
	memset(msgBuf, 0, BUFSIZE);

	/* point the header and the msg structure pointers into the buffer */
	nlMsg = (struct nlmsghdr *)msgBuf;
	rtMsg = (struct rtmsg *)NLMSG_DATA(nlMsg);

	/* Fill in the nlmsg header*/
	nlMsg->nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); // Length of message.
	nlMsg->nlmsg_type = RTM_GETROUTE; // Get the routes from kernel routing table .

	nlMsg->nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST; // The message is a request for dump.
	nlMsg->nlmsg_seq = msgSeq++; // Sequence of the message packet.
	nlMsg->nlmsg_pid = getpid(); // PID of process sending the request.

	/* Send the request */
	if(send(sock, nlMsg, nlMsg->nlmsg_len, 0) < 0){
		printf("Write To Socket Failed...\n");
		return -1;
	}

	/* Read the response */
	if((len = readNlSock(sock, msgBuf, msgSeq, getpid())) < 0) {
		printf("Read From Socket Failed...\n");
		return -1;
	}
	/* Parse and print the response */
	rtInfo = (struct route_info *)malloc(sizeof(struct route_info));
	for(;NLMSG_OK(nlMsg,len);nlMsg = NLMSG_NEXT(nlMsg,len)){
		memset(rtInfo, 0, sizeof(struct route_info));
		parseRoutes(nlMsg, rtInfo,gateway);
	}
	free(rtInfo);
	close(sock);
	return 0;
}

int netcheckagain(char *tem_ipdz,char *tem_zwym,char *tem_mrwg)
{
	struct sockaddr_in *my_ip;
	struct sockaddr_in *addr;
	struct sockaddr_in myip;
	my_ip = &myip;
	struct ifreq ifr;
	int sock;

	if((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
	{
		printf("sock error \n");
		return -1;
	}
	strcpy(ifr.ifr_name, "eth0");

	//取本机IP地址
	if(ioctl(sock, SIOCGIFADDR, &ifr) < 0)
	{
		printf("ioctl SIOCGIFADDR \n");
		return -1;
	}
	my_ip->sin_addr = ((struct sockaddr_in *)(&ifr.ifr_addr))->sin_addr;
	strcpy(tem_ipdz,inet_ntoa(my_ip->sin_addr));
	//printf("\n%s\n",tem_ipdz);
	
	//取本机掩码
	if( ioctl( sock, SIOCGIFNETMASK, &ifr) == -1 )
	{
		perror("[-] ioctl");
		return -1;
	}
	addr = (struct sockaddr_in *) & (ifr.ifr_addr);
	strcpy(tem_zwym,inet_ntoa(addr->sin_addr));
	get_gateway(tem_mrwg);
	
	close(sock);
	return 0;
}

int net_check(void)
{
	char buff[100] = {0};
	char tem_ipdz[16]={0};
	char tem_zwym[16]={0};
	char tem_mrwg[16]={0};
	int i;
	ioctl(fd, IOCTLCLEARSCREEN);

	sprintf(buff,"ifconfig eth0 %s netmask %s",ipdz,zwym);
	if(system(buff) != 0)
		printf("system(1) error");

	if(system("ifconfig eth0 down")!=0)
		printf("system(2) error");

	if(system("ifconfig eth0 up")!=0)
		printf("system(3) error");

	sprintf(buff,"route add default gw %s",mrwg);
	if(system(buff)!=0)
		printf("system(4) error");

	netcheckagain(tem_ipdz,tem_zwym,tem_mrwg);

	if((strcmp(ipdz,tem_ipdz)==0) && (strcmp(zwym,tem_zwym)==0) && (strcmp(mrwg,tem_mrwg)==0))
	{

		printf("检测到网络,配置成功!");	
		for(i=0;i<5000000;i++); 
		return 0;
	}
	else
	{
		printf("请检查网络物理连接和网络设置,配置成功!");	
		for(i=0;i<5000000;i++); 
		return 1;
	}
}
int main()
{
 net_check();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -