嵌入式 hi3518平台指定网卡测试是否通外网

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 [html] view plain copy        [html] view plain copy     /******************************...
[html]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1.   
[html]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. /********************************** (C) COPYRIGHT *******************************  
  2.   * File Name          : netstatus_check.c  
  3.   * Author             : skdkjzz  
  4.   * Date               : 2014/08/07  
  5.   * Description        : 检测本机是否连通外部网络(Joseph_Ping 百度)。  
  6.   *********************************************************************************/  
  7.     
  8. #include <stdio.h>    
  9. #include <string.h>  
  10. #include <stdlib.h>   
  11. #include <sys/socket.h>     
  12. #include <netinet/in.h>     
  13. #include <netinet/ip.h>     
  14. #include <netinet/ip_icmp.h>     
  15. #include <netdb.h>    
  16. #include <errno.h>  
  17. #include <sys/types.h>  
  18. #include <netinet/in.h>  
  19. #include <sys/types.h>    
  20. #include <string.h>    
  21. #include <stdlib.h>    
  22. #include <sys/types.h>    
  23. #include <sys/ioctl.h>    
  24. #include <sys/stat.h>    
  25. #include <stdio.h>    
  26. #include <string.h>    
  27. #include <errno.h>    
  28. #include <net/if.h>    
  29. #include <sys/utsname.h>    
  30. #include <limits.h>    
  31. #include <ctype.h>       
  32. #include <sys/socket.h>    
  33. #include <netinet/in.h>    
  34. #include <arpa/inet.h>       
  35. #include <linux/sockios.h>   
  36.   
  37.   
  38. #define PACKET_SIZE     4096     
  39. #define ERROR           -1     
  40. #define SUCCESS         0     
  41.       
  42. /*效验算法*/   
  43. unsigned short Joseph_Cal_Chksum(unsigned short *addr, int len)   
  44. {    
  45.     int nleft=len;    
  46.     int sum=0;    
  47.     unsigned short *w=addr;    
  48.     unsigned short answer=0;      
  49.   
  50.     while(nleft > 1)   
  51.     {    
  52.       sum += *w++;    
  53.       nleft -= 2;    
  54.     }    
  55.   
  56.     if( nleft == 1)    
  57.     {         
  58.       *(unsigned char *)(&answer) = *(unsigned char *)w;    
  59.       sum += answer;    
  60.     }    
  61.   
  62.     sum = (sum >> 16) + (sum & 0xffff);    
  63.     sum += (sum >> 16);    
  64.     answer = ~sum;    
  65.   
  66.     return answer;    
  67. }    
  68.   
  69. int Joseph_Ping( char *ips,char *srcip , int timeout)    /* Ping函数 */    
  70. {        
  71.     struct timeval *tval;          
  72.     int maxfds = 0;    
  73.     fd_set readfds;    
  74.   
  75.     struct sockaddr_in addr;        
  76.     struct sockaddr_in from;  
  77.     struct ifreq ifr;  
  78.     bzero(&addr,sizeof(addr));  /* 设定Ip信息 */    
  79.     addr.sin_family = AF_INET;    
  80.     addr.sin_addr.s_addr = inet_addr(ips);    
  81.   
  82.     int sockfd;    
  83.     sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);   /* 取得socket */     
  84.     if (sockfd 0)     
  85.     {      
  86.       printf("ip:%s,socket error\n",ips);      
  87.       return ERROR;      
  88.     }      
  89.   
  90.     struct timeval timeo;  
  91.     timeo.tv_sec = timeout / 1000;  /* 设定TimeOut时间  */  
  92.     timeo.tv_usec = timeout % 1000;    
  93.   
  94. #if 0  
  95.     /*set src ip*/  
  96.     bzero(&from,sizeof(from));  /* 设定Ip信息 */  
  97.     from.sin_family = AF_INET;    
  98.     from.sin_addr.s_addr = inet_addr(srcip);      
  99.   
  100.     if (setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_IF,(struct sockaddr *)&from, sizeof(from)) == -1)      
  101.     {      
  102.       printf("ip:%s,setsockopt error \n",srcip);       
  103.       return ERROR;  
  104.     }    
  105.     bind(sockfd,(struct sockaddr *)&addr, sizeof(addr));  
  106. #else  
  107.     strcpy(ifr.ifr_name, srcip);  
  108.   
  109.     if (setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr)) == -1)  
  110.     {  
  111.         printf("can't bind to interface %s\n",ifr.ifr_name);  
  112.     }  
  113.       
  114. #endif  
  115.   
  116.     printf("%s %d\n",__FUNCTION__,__LINE__);  
  117.   
  118.     if (setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeo, sizeof(timeo)) == -1)      
  119.     {      
  120.       printf("ip:%s,setsockopt error\n",ips);      
  121.       return ERROR;      
  122.     }  
  123.     else  
  124.     {  
  125.         printf("ip:%s,setsockopt ok \n",ips);    
  126.     }  
  127.   
  128.     char sendpacket[PACKET_SIZE];      
  129.     char recvpacket[PACKET_SIZE];      
  130.   
  131.     memset(sendpacket, 0, sizeof(sendpacket));   /* 设定Ping包 */    
  132.     pid_t pid;    
  133.   
  134.     pid=getpid();   /* 取得PID,作为Ping的Sequence ID */     
  135.     struct ip *iph;    
  136.     struct icmp *icmp;    
  137.           
  138.     icmp=(struct icmp*)sendpacket;   
  139.   
  140.     icmp->icmp_type=ICMP_ECHO;   /* 回显请求 */    
  141.     icmp->icmp_code=0;     
  142.     icmp->icmp_cksum=0;     
  143.     icmp->icmp_seq=0;      
  144.     icmp->icmp_id=pid;     
  145.     tval= (struct timeval *)icmp->icmp_data;     
  146.     gettimeofday(tval,NULL);        
  147.     icmp->icmp_cksum=Joseph_Cal_Chksum((unsigned short *)icmp,sizeof(struct icmp));  /* 校验 */      
  148.   
  149.     int n;  /* 发包  */     
  150.     n = sendto(sockfd, (char *)&sendpacket, sizeof(struct icmp), 0, (struct sockaddr *)&addr, sizeof(addr));        
  151.     if (n 1)     
  152.     {      
  153.       printf("ip:%s,sendto error\n",ips);      
  154.       return ERROR;      
  155.     }      
  156.          
  157.     while(1)      /* 接受 由于可能接受到其他Ping的应答消息,所以这里要用循环 */    
  158.     {      
  159.       FD_ZERO(&readfds);    /* 设定TimeOut时间,这次才是真正起作用的  */   
  160.       FD_SET(sockfd, &readfds);      
  161.       maxfds = sockfd + 1;      
  162.       n = select(maxfds, &readfds, NULL, NULL, &timeo);      
  163.       if (n <= 0)       
  164.       {      
  165.           printf("ip:%s,Time out error\n",ips);      
  166.           close(sockfd);      
  167.           return ERROR;      
  168.       }      
  169.           
  170.       memset(recvpacket, 0, sizeof(recvpacket));      
  171.       int fromlen = sizeof(from);      /* 接受    */   
  172.       n = recvfrom(sockfd, recvpacket, sizeof(recvpacket), 0, (struct sockaddr *)&from, (socklen_t *)&fromlen);      
  173.       if (n 1) {  
  174.           
  175.           return ERROR;   
  176.       }      
  177.               
  178.       char *from_ip = (char *)inet_ntoa(from.sin_addr);        
  179.       if (strcmp(from_ip,ips) != 0)    /* 判断是否是自己Ping的回复 */    
  180.       {      
  181.           printf("Now Pingip:%s Fromip:%s\n Now Pingip is not same to Fromip,so Joseph_Ping wrong!\n",ips,from_ip);    
  182.           return ERROR;   
  183.       }      
  184.           
  185.       iph = (struct ip *)recvpacket;          
  186.       icmp=(struct icmp *)(recvpacket + (iph->ip_hl<<2));     
  187.              
  188.   
  189.       if (icmp->icmp_type == ICMP_ECHOREPLY && icmp->icmp_id == pid)   /* 判断Ping回复包的状态 ICMP_ECHOREPLY回显应答 */    
  190.       {  
  191.           return SUCCESS;  
  192.       }   /* 正常退出循环 */     
  193.       else         
  194.           continue;    /* 否则继续等  */    
  195.     }  
  196.   
  197.     return 0;  
  198. }  
  199.     
  200. int main(int argc ,char *argv[])    
  201. {    
  202.     int Qy_Ret = 0;  
  203.     struct hostent *h=NULL;  
  204.     char hostname[16]="www.baidu.com";  
  205.   
  206.     char aPing[16]="202.108.22.5";  /* Joseph_Ping form ip  */  
  207.     Qy_Ret = Joseph_Ping(aPing,argv[1],3000);  
  208.     printf("Qy_Ret is %d\n",Qy_Ret);  
  209.     if(Qy_Ret == 0)    
  210.     {    
  211.         printf("Network is Ok!\n");   
  212.         return 0;  
  213.     }    
  214.     else      
  215.     {    
  216.         printf("Network is Bad!\n");  
  217.         return -1;  
  218.     }  
  219.       
  220.     sprintf(hostname,"%s",(char *)inet_ntoa(*((struct in_addr *)h->h_addr))); /* Joseph_Ping form hostname */  
  221.     if(Joseph_Ping(hostname,argv[1],3000))    
  222.     {    
  223.         printf("Network is Ok!\n");    
  224.         return 0;  
  225.     }    
  226.     else      
  227.     {    
  228.         printf("Network is Bad!\n");   
  229.         return -1;  
  230.     }     
  231. }  
  232.   
  233. </span>  
目录
相关文章
|
2天前
|
数据挖掘 测试技术 网络安全
LabVIEW开发卫星测试平台
LabVIEW开发卫星测试平台
|
2天前
|
算法 物联网 5G
LabVIEW开发最小化5G系统测试平台
LabVIEW开发最小化5G系统测试平台
10 0
|
4天前
|
消息中间件 测试技术 Linux
linux实时操作系统xenomai x86平台基准测试(benchmark)
本文是关于Xenomai实时操作系统的基准测试,旨在评估其在低端x86平台上的性能。测试模仿了VxWorks的方法,关注CPU结构、指令集等因素对系统服务耗时的影响。测试项目包括信号量、互斥量、消息队列、任务切换等,通过比较操作前后的时戳来测量耗时,并排除中断和上下文切换的干扰。测试结果显示了各项操作的最小、平均和最大耗时,为程序优化提供参考。注意,所有数据基于特定硬件环境,测试用例使用Alchemy API编写。
10 0
linux实时操作系统xenomai x86平台基准测试(benchmark)
|
4天前
|
传感器 Linux 测试技术
xenomai 在X86平台下中断响应时间测试
该文讨论了实时操作系统中断响应时间的重要性,并介绍了x86中断机制和Xenomai的中断管理,包括硬件中断和虚拟中断的处理。Xenomai通过I-Pipe确保实时性,中断优先级高的Xenomai先处理中断。文中还提到了中断响应时间的测试设计,分别针对I-Pipe内核间虚拟中断和硬件中断进行了测试,并给出了在不同负载下的测试结果。
8 0
xenomai 在X86平台下中断响应时间测试
|
11天前
|
Linux 测试技术 数据安全/隐私保护
CentOS安装MeterSphere并实现无公网IP远程访问本地测试平台
CentOS安装MeterSphere并实现无公网IP远程访问本地测试平台
|
20天前
|
人工智能 监控 数据处理
【AI大模型应用开发】【LangSmith: 生产级AI应用维护平台】1. 快速上手数据集与测试评估过程
【AI大模型应用开发】【LangSmith: 生产级AI应用维护平台】1. 快速上手数据集与测试评估过程
39 0
|
2月前
|
缓存 运维 Serverless
应用研发平台EMAS产品常见问题之测试检查更新没有反应如何解决
应用研发平台EMAS(Enterprise Mobile Application Service)是阿里云提供的一个全栈移动应用开发平台,集成了应用开发、测试、部署、监控和运营服务;本合集旨在总结EMAS产品在应用开发和运维过程中的常见问题及解决方案,助力开发者和企业高效解决技术难题,加速移动应用的上线和稳定运行。
|
2月前
|
机器学习/深度学习 人工智能 监控
视觉智能平台常见问题之体验产品的美颜测试关掉如何解决
视觉智能平台是利用机器学习和图像处理技术,提供图像识别、视频分析等智能视觉服务的平台;本合集针对该平台在使用中遇到的常见问题进行了收集和解答,以帮助开发者和企业用户在整合和部署视觉智能解决方案时,能够更快地定位问题并找到有效的解决策略。
24 1
|
3月前
|
测试技术
Lim测试平台测试报告说明
Lim测试平台测试报告说明
34 2
|
3月前
|
SQL 测试技术 数据库连接
Lim接口测试平台-接口测试功能详解
Lim接口测试平台-接口测试功能详解
61 1

热门文章

最新文章