嵌入式 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用户资料 ----------------------------------- ...
随机推荐
- redis资料汇总
redis资源比较零散,引用nosqlfan上的文章,方便大家需要时翻阅.大家看完所有的,如果整理出文章的,麻烦知会一下,方便学习. 1.Redis是什么? 十五分钟介绍 Redis数据结构 Redi ...
- CF 353A Domino
#include<stdio.h> #include<math.h> int main() { int i,n; int x,y; int m1,m2,m3,m4; while ...
- 【PSR规范专题(3)】PSR-2 代码风格规范
[PSR规范专题(3)]PSR-2 代码风格规范 标签(空格分隔): PHP 转载自:https://github.com/PizzaLiu/PHP-FIG/blob/master/PSR-2-cod ...
- Maven的安装
我对maven的了解,仅仅局限在百度百科. 由于近期公司需求,我找到了个maven教程:http://wentao365.iteye.com/blog/903396 安装maven其实很简单,就是在A ...
- wordpress可视化编辑器的开启/关闭
这个可视化编辑器还真是有些难找,在后台菜单“用户”->"我的个人资料" 对以下勾选即可
- TestNG超详细教程
testNG官网:http://testng.org/doc/download.html howtodoinjava.com里的testNG教程,简单详细:http://howtodoinjava.c ...
- PowerDesigner导出表到word
一.模版修改 在导出表时,powerdesigner默认为我们提供了很多的模版,在工具栏中选择[Report--->Report Template]//// [被翻译成报告(Report)--- ...
- Django自定义模型(model)中的字段标签
方法一: 在编辑页面中,每个字段的标签都是从模块的字段名称生成的. 规则很简单: 用空格替换下划线:首字母大写.例如:Book模块中publication_date的标签是Publication da ...
- BroadcastService的测试用例
程序运行起来之后,需要用多个telnet客户端来进行测试 连接的命令为conn deviceNumber 广播命令为broa message 需要注意的是:示例代码有bug, broadcastDic ...
- 关于结构化BOM的思考
参加了今天的"自主生产音箱类产品BOM结构问题"(即非采购而是制造的音箱)会议,我发现大家在会议上呈现的产品结构对生产计划的层级需求已上升到5层的需求了,又找段会胜要了各位前期就此 ...