嵌入式 hi3518平台获取网关
- </pre><pre code_snippet_id="495447" snippet_file_name="blog_20141024_1_7065081" name="code" class="html">/********************************** (C) COPYRIGHT *******************************/
- * File Name : get_gw.c
- * Author : skdkjzz
- * Date : 2014/08/07
- * Description : linux下获取网卡信息
- *********************************************************************************/
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <asm/types.h>
- #include <netinet/ether.h>
- #include <netinet/in.h>
- #include <net/if.h>
- #include <stdio.h>
- #include <sys/socket.h>
- #include <sys/ioctl.h>
- #include <linux/netlink.h>
- #include <linux/rtnetlink.h>
- #include <sys/types.h>
- #define JSOEPH_NET_RMSG_BUFSIZE 8192
- typedef struct route_info{
- u_int dstAddr;
- u_int srcAddr;
- u_int gateWay;
- u_int genmask;
- char ifName[IF_NAMESIZE];
- }JOSEPH_ROUTE_INFO;
- #ifdef JOSEPH_CAT_ENUM
- /* Routing message attributes */
- enum rtattr_type_t {
- RTA_UNSPEC,
- RTA_DST,
- RTA_SRC,
- RTA_IIF,
- RTA_OIF,
- RTA_GATEWAY,
- RTA_PRIORITY,
- RTA_PREFSRC,
- RTA_METRICS,
- RTA_MULTIPATH,
- RTA_PROTOINFO, /* no longer used */
- RTA_FLOW,
- RTA_CACHEINFO,
- RTA_SESSION, /* no longer used */
- RTA_MP_ALGO, /* no longer used */
- RTA_TABLE,
- RTA_MARK,
- __RTA_MAX
- };
- #endif
- int Joseph_ReadNlSock(int sockFd, char *bufPtr, int seqNum, int pId)
- {
- struct nlmsghdr *nlHdr;
- int readLen = 0, msgLen = 0;
- do
- {
- /* Recieve response from the kernel */
- if((readLen = recv(sockFd, bufPtr, JSOEPH_NET_RMSG_BUFSIZE - msgLen, 0)) < 0){
- printf("SOCK READ Error !\n");
- return -1;
- }
- nlHdr = (struct nlmsghdr *)bufPtr;
- /* Check if the header is valid */
- if((NLMSG_OK(nlHdr, readLen) == 0) || (nlHdr->nlmsg_type == NLMSG_ERROR))
- {
- printf("Error in recieved packet !\n");
- 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;
- }
- /* For printing the routes. */
- void Joseph_PrintRoute(struct route_info *rtInfo,char *if_name_in)
- {
- char tempBuf[512];
- if(strcmp(rtInfo->ifName,if_name_in) == 0)
- {
- /* Print Destination address */
- if(rtInfo->dstAddr != 0)
- strcpy(tempBuf, (char *)inet_ntoa(rtInfo->dstAddr));
- else
- sprintf(tempBuf,"0.0.0.0\t");
- fprintf(stdout,"%s\t", tempBuf);
- /* Print Gateway address */
- if(rtInfo->gateWay != 0)
- strcpy(tempBuf, (char *)inet_ntoa(rtInfo->gateWay));
- else
- sprintf(tempBuf,"0.0.0.0\t");
- fprintf(stdout,"%s\t", tempBuf);
- /* Print Interface Name*/
- fprintf(stdout,"%s\t", rtInfo->ifName);
- /* Print genmask address */
- if(rtInfo->genmask != 0)
- strcpy(tempBuf, (char *)inet_ntoa(rtInfo->genmask));
- else
- sprintf(tempBuf,"0.0.0.0\t");
- fprintf(stdout,"%s\t", tempBuf);
- /* Print Source address */
- if(rtInfo->srcAddr != 0)
- strcpy(tempBuf, (char *)inet_ntoa(rtInfo->srcAddr));
- else
- sprintf(tempBuf,"0.0.0.0\t");
- fprintf(stdout,"%s\n", tempBuf);
- }
- }
- /* For parsing the route info returned */
- int Joseph_ParseRoutes(struct nlmsghdr *nlHdr, struct route_info *rtInfo,char *gateway,char *if_name_in)
- {
- struct rtmsg *rtMsg;
- struct rtattr *rtAttr;
- int rtLen;
- char *tempBuf = NULL;
- 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))
- {
- free(tempBuf);
- tempBuf = NULL;
- return -1;
- }
- /* 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;
- }
- }
- //printf("%s\n", (char *)inet_ntoa(rtInfo->dstAddr));
- //ADDED BY BOB - ALSO COMMENTED Joseph_PrintRoute
- if (strstr((char *)inet_ntoa(rtInfo->dstAddr), "0.0.0.0"))
- {
- sprintf(gateway,"%s",(char *)inet_ntoa(rtInfo->gateWay));
- }
- Joseph_PrintRoute(rtInfo,if_name_in);
- free(tempBuf);
- tempBuf = NULL;
- return 0;
- }
- int Joseph_Get_Gateway(char *gateway,char *if_name)
- {
- struct nlmsghdr *nlMsg;
- struct rtmsg *rtMsg;
- struct route_info *rtInfo;
- char msgBuf[JSOEPH_NET_RMSG_BUFSIZE];
- int sock, len, msgSeq = 0;
- char buff[1024];
- if(strlen(if_name) == 0 || gateway == NULL)
- {
- return -1;
- }
- /* Create Socket */
- if((sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE)) < 0)
- {
- printf("Socket Creation Error !\n");
- return -1;
- }
- /* Initialize the buffer */
- memset(msgBuf, 0, JSOEPH_NET_RMSG_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");
- close(sock);
- return -1;
- }
- /* Read the response */
- if((len = Joseph_ReadNlSock(sock, msgBuf, msgSeq, getpid())) < 0)
- {
- printf("Read From Socket Failed...\n");
- close(sock);
- return -1;
- }
- /* Parse and print the response */
- rtInfo = (struct route_info *)malloc(sizeof(struct route_info));
- /* THIS IS THE NETTSTAT -RL code I commented out the printing here and in parse routes */
- //fprintf(stdout, "Destination\tGateway\tInterface\tSource\n");
- for( ; NLMSG_OK(nlMsg,len); nlMsg = NLMSG_NEXT(nlMsg,len))
- {
- memset(rtInfo, 0, sizeof(struct route_info));
- Joseph_ParseRoutes(nlMsg,rtInfo,gateway,if_name);
- }
- free(rtInfo);
- rtInfo = NULL;
- close(sock);
- return 0;
- }
- int main(int argc,char *argv[])
- {
- int itertion = 0;
- char gateway[16]={0};
- int Qy_Ret = 0;
- if(argc != 2)
- {
- return -1;
- }
- while(itertion < 30)
- {
- Qy_Ret = Joseph_Get_Gateway(gateway,argv[1]);
- if(Qy_Ret <0)
- {
- return -1;
- }
- itertion++;
- printf("Gateway:%s\n", gateway);
- sleep(1);
- }
- return 0;
- }
- </span></span>
from:http://blog.csdn.net/skdkjzz/article/details/40427171
嵌入式 hi3518平台获取网关的更多相关文章
- 嵌入式 hi3518平台获取网络环境中的ip、netmask、broadcast等信息
<span style="font-family:Courier New;"> /********************************** (C) COPY ...
- 微服务监控平台获取网关(zuul)配置列表
步骤: (1)读取zuul的配置文件,获取路由配置项信息: private static Properties props; static { String fileName = "appl ...
- 嵌入式 hi3518平台uboot引导nfs文件系统
首先贴出来我的bootargs的设置(注没有换行符!!!): setenv bootargs noinitrd mem=64M root=/dev/nfs init=/linuxrc rw nfsro ...
- 嵌入式 hi3518平台检测网线是否插上
/********************************** (C) COPYRIGHT ******************************* * File Name ...
- 嵌入式 hi3518平台指定网卡测试是否通外网
版权声明:本文为博主原创文章,未经博主允许不得转载. /********************************** (C) COPYRIGHT *********************** ...
- 嵌入式 hi3518平台增加路由代码
<span style="font-family:Courier New;"> /********************************** (C) COPY ...
- 嵌入式 hi3518平台以太网网络模块设计包括重连机制和网线检测机制
<span style="font-family:Courier New;"> #include <sys/types.h> #include <st ...
- 嵌入式 hi3518平台多路码流添加osd
<span style="font-family:Courier New;"> /******************************************* ...
- 使用腾讯开发平台获取QQ用户数据资料
<今天是七夕:祝大家七夕嗨皮,前可么么哒,后可啪啪啪> Tips:本篇博客将教你如何使用腾讯开发平台获取QQ用户资料 ----------------------------------- ...
随机推荐
- lintcode:数字组合 II
数字组合 II 给出一组候选数字(C)和目标数字(T),找出C中所有的组合,使组合中数字的和为T.C中每个数字在每个组合中只能使用一次. 注意事项 所有的数字(包括目标数字)均为正整数. 元素组合(a ...
- CF 353A Domino
#include<stdio.h> #include<math.h> int main() { int i,n; int x,y; int m1,m2,m3,m4; while ...
- iOS开发--CoreGraphics简单绘图
一.导入coreGraphics.framework 二.绘制图形 1.绘制矩形 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 // 绘制矩形 - (v ...
- QQ群共享文件下载很慢解决办法
QQ群共享文件下载很慢解决办法.我们经常会不群里面共享文件,文件文件稍大,下载非常慢.家庭是20M的网速,一般正常下载能够达到2.5MB左右,而在QQ群实际下载网速却只有80KB左右.如果要下1G,就 ...
- swift:入门知识之类和对象
1.swift中使用class创建一个类.一个类的声明则是在类里作为常量或变量声明的,除了是在类的上下文中.在方法和函数中也是这么写的. 2.swift中使用init(...)作为初始化构造函数 3. ...
- linux怎么运行.SH文件
执行sh xx.sh命令就可以执行.sh文件了.如果直接执行xx.sh文件,就报权限错误 解决办法:执行chmod u+x xx.sh 来添加执行权限
- php常用代码(一)
1.连接MYSQL数据库代码 <?php $connec=mysql_connect("localhost","root","root" ...
- JVM的相关知识整理和学习--(转载)
JVM是虚拟机,也是一种规范,他遵循着冯·诺依曼体系结构的设计原理.冯·诺依曼体系结构中,指出计算机处理的数据和指令都是二进制数,采用存储程序方式不加区分的存储在同一个存储器里,并且顺序执行,指令由操 ...
- python3代码
import urllib.request url="http://mm.taobao.com/json/request_top_list.htm?type=0&page=1&quo ...
- 《OD学HBase》20160814
一.HBase引入 http://hbase.apache.org/ 大数据的数据库 1. 概述 Hadoop生态系统中的一个分布式.可拓展.面向列.可伸缩,具有自动容错功能的数据库. NoSQL数据 ...