嵌入式 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用户资料 ----------------------------------- ...
随机推荐
- converntion
One convention that we have is to use the names of fruits and vegetables for variables(only in small ...
- 定制CentOS (Redhat AS 5.1)安装盘
CentOS(Redhat)提供了一套完整的自动化安装机制,利用该机制,我们可以自己定制无人值守的自动安装光盘,也可以进行系统裁减,甚至可以以CentOS为基础制作自己软件系统的系统安装盘.以下全部内 ...
- Maven的安装
我对maven的了解,仅仅局限在百度百科. 由于近期公司需求,我找到了个maven教程:http://wentao365.iteye.com/blog/903396 安装maven其实很简单,就是在A ...
- 修改bigbluebutton白板上传中文乱码
中文命名的文档,上传是乱码 -- 显示的 打开后, 中文部分是乱码 Comment 1 by project member ffdixon, Nov 08, 2010 Translatio ...
- ios开发--GCD使用介绍:4-延迟执行操作
在开发过程中,我们有时会希望把一些操作封装起来延迟一段时间后再执行.iOS开发中,有两种常用的方法可以实现延迟执行,一种是使用GCD,另外一种是使用NSRunLoop类中提供的方法. 1.使用GCD实 ...
- iOS开发--iOS及Mac开源项目和学习资料
文/零距离仰望星空(简书作者)原文链接:http://www.jianshu.com/p/f6cdbc8192ba著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 原文出处:codecl ...
- 配置Tomcat的服务端口
- Mysql笔记——DML
数据操纵语言DML(Data Manipulation Language),用户通过它可以实现对数据库的基本操作. ========================== 1 插入数据 语法:INSER ...
- Redis的Order Set操作
有序集合 zadd key score1 value1 score2 value2 .. 添加元素 127.0.0.1:6379> zadd class 12 lily 13 lucy 18 l ...
- GraphicsMagick / ImageMagick缺少lib报错no decode delegate for this image format
下载相应的lib,编译安装就行了 cd ~ #下载包 wget http://www.imagemagick.org/download/delegates/zlib-1.2.7.tar.gz wget ...