<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    嵌入式 hi3518平臺指定網卡測試是否通外網

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接 [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>  
    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全