zoukankan      html  css  js  c++  java
  • 网络编程之ping

    #include <sys/types.h>
    #include <netinet/ip.h>
    #include <netdb.h>
    #include<arpa/inet.h>
    #include <errno.h>
    #include <netinet/ip_icmp.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <stdio.h>
    #include <signal.h>
    #include <arpa/inet.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <unistd.h>
    #include <netinet/in.h>
    #include <netinet/ip.h>
    #include <netinet/ip_icmp.h>
    #include <netdb.h>
    #include <setjmp.h>
    #include <errno.h>
    unsigned short cal_chksum(unsigned short *addr,int len)
    {       int nleft=len;
            int sum=0;
            unsigned short *w=addr;
            unsigned short answer=0;
            while(nleft>1)
            {       sum+=*w++;
                    nleft-=2;
            }
            if( nleft==1)
            {       *(unsigned char *)(&answer)=*(unsigned char *)w;
                    sum+=answer;
            }
            sum=(sum>>16)+(sum&0xffff);
            sum+=(sum>>16);
            answer=~sum;
            return answer;
    }
    int main(int argc, char **argv)
    {
     if(argc < 2)
    {
    printf("you input arg is less than two ");
    }
       struct sockaddr_in serveraddr;
       int sockfd = 0;
       if((sockfd = socket(AF_INET,SOCK_RAW,IPPROTO_ICMP)) <0 )
       {
          printf("error ");
       }
       printf("sockfd is %d ",sockfd);
       bzero(&serveraddr,sizeof(serveraddr));
       serveraddr.sin_family = AF_INET;
       serveraddr.sin_port = htons(0);
    //   char arg[] = "192.168.1.150";
       inet_pton(AF_INET,argv[1],&serveraddr.sin_addr);
       char sendpack[1024] = {0};

       struct icmp *picmp = NULL;
       picmp = (struct icmp*)sendpack;
       picmp->icmp_type = ICMP_ECHO;
       picmp->icmp_code = 0;
       picmp->icmp_cksum=0;
       picmp->icmp_seq=0;
       picmp->icmp_id=getpid();
       picmp->icmp_cksum=cal_chksum( (unsigned short *)picmp,64);
       errno = 0;
      // int num = 2;
       int n = 0;
       double rtt;
       struct ip *piphead;
       struct timeval tvsend,tvrecv;
       char recvbuff[4096] = {0};
       struct sockaddr_in addrfrom;
       int len =  sizeof(addrfrom);
       while(1)
       {

         //tvsend = (struct timeval *)picmp->icmp_data;
         gettimeofday(&tvsend,NULL);
         if(( n = sendto(sockfd,sendpack,64,0,(struct sockaddr*)&serveraddr,sizeof(serveraddr))) == -1)
         {      
            perror("sendto error ");
         }
         sleep(1);
         if((recvfrom(sockfd, recvbuff, sizeof(recvbuff), 0, (struct sockaddr*)&addrfrom,&len)) < 0)
         {
           printf("error");
         }
         gettimeofday(&tvrecv,NULL);
         rtt = 1000 * (tvrecv.tv_sec - tvsend.tv_sec) + (tvrecv.tv_usec - tvsend.tv_usec)/1000;
         printf("recvform %s : rtt = %.3fms ",inet_ntoa(addrfrom.sin_addr),rtt);
       }
       return 0;

    }

  • 相关阅读:
    git-【六】分支的创建与合并
    git-【五】远程仓库
    git-【四】撤销修改和删除文件操作
    git-【三】理解工作区与暂存区的区别
    git-【二】本地git操作提交、版本回退
    git-【一】概述安装
    java-基础-【四】实际编程中的对象
    博客园打赏、赞助功能
    js-template-art【四】通过helper方法注册,调用外部方法
    js-template-art【三】js api
  • 原文地址:https://www.cnblogs.com/liuweilinlin/p/3161222.html
Copyright © 2011-2022 走看看