嵌入式 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用户资料 ----------------------------------- ...
随机推荐
- Data Base sqlServer 组合主键
sqlServer 组合主键 创建表时: create table Person ( Name1 ) not null ,Name2 ) not null primary key(Name1,Na ...
- Html 全屏切换效果
来源 http://www.imooc.com/learn/374 pageswitch.js (function ($) { var defaults = { 'container': '#cont ...
- rqnoj-106-最大加权矩形-dp
和我之前做的那个切西瓜的题目相比就是小巫见大巫了.. 运用最长字段和的原理把O(n^4)转化成O(n^3) #include<stdio.h> #include<string.h&g ...
- Entity Framework学习 - 3.关联查询
1.Inner Join(默认) var Goods = from goods in db.T_Goods join types in db.T_GoodsTyp ...
- kettle的jdk1.7环境变量配置
1).到官网下载需要安装的kettle版本,目前最新版本4.2,官网地址:http://kettle.pentaho.org,我们是使用的版本是kettle3.2 2).本地安装jdk 1.4或以上版 ...
- python3代码
import urllib.request url="http://mm.taobao.com/json/request_top_list.htm?type=0&page=1&quo ...
- SPOJ 1739 Yet Another Equation(Pell方程)
题目链接:http://www.spoj.com/problems/EQU2/ 题意:给出方程x^2-n*y^2=1的最小整数解. 思路:参见金斌大牛的论文<欧几里得算法的应用>. imp ...
- [CF580B]Kefa and Company(滑动窗口)
题目链接:http://codeforces.com/problemset/problem/580/B 某人有n个朋友,这n个朋友有钱数m和关系s两个属性.问如何选择朋友,使得这些朋友之间s最大差距小 ...
- MongoDB 学习笔记(一)基础篇
1.MongoDB 特点 面向集合存储,存储对象类型的数据方便 模式自由,不需要定义任何模式(schma) 动态查询 完全索引,包含内部对象 复制和故障恢复方便 高效的二进制数据存储 支持c# 平台驱 ...
- CSS 中定位的使用
position relative 设置区块基准点为左上角(相对定位 以区块的左上角为基准点 仍然会暂居原来的位置) a.不影响元素本身的特性: b.不使元素脱离文档流: c.如果没有定位偏移量,对元 ...