免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2140 | 回复: 4
打印 上一主题 下一主题

请教一个可以并发执行的ping程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-02-21 20:28 |只看该作者 |倒序浏览
请教一个可以并发执行的ping程序,就是对某一指定的IP进行大数量的PING程序而无等每次都等待前一次ping完成后在执行下一次ping
                  
                    本人刚学UNIX,请多指教,谢谢!
tomken 该用户已被删除
2 [报告]
发表于 2003-02-21 21:50 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2003-02-21 22:07 |只看该作者

请教一个可以并发执行的ping程序

本人要做一个网络通道数据的分析
  所以每次在返回数据时要将数据存储起来作为分析资料
  所以必须修改ping程序
  
  还请多帮忙

论坛徽章:
0
4 [报告]
发表于 2003-02-21 22:24 |只看该作者

请教一个可以并发执行的ping程序



  1. /*
  2. 函数功能:ping一个ip或主机,ping的原理是:发送icmp数据包,
  3.   接受网络返回的ip数据包,分析是否能达。注意在互联网上一次调用可能不通,
  4.   应采用多次来判断是否可达
  5. 传入参数:
  6.   host_name: 要ping的主机名或ip地址
  7.   time_used: 返回实际使用的毫秒数
  8. 返回参数:
  9.   可达:1
  10.   不可达:0
  11. */
  12. int TNetTool::Ping(char * host_name,int * time_used)
  13. {
  14. int sock_handle;
  15. struct hostent * hp;
  16. struct        sockaddr_in        where_from,where_to;

  17.   if(host_name==NULL) return 0;
  18.   memset(&where_from, 0, sizeof(where_from));

  19.   memset(&where_to, 0, sizeof(where_to));
  20.         where_to.sin_family = AF_INET;
  21.         where_to.sin_addr.s_addr = inet_addr(host_name);
  22.         if ((int)where_to.sin_addr.s_addr == -1)
  23.         {
  24.                 hp = gethostbyname(host_name);
  25.     if(hp==NULL)
  26.     {
  27.       printf("gethostbyname fail: %s\n",host_name);
  28.       return 0;
  29.     };
  30.                 where_to.sin_family = hp->;h_addrtype;
  31.            where_to.sin_addr = *((in_addr *) *hp->;h_addr_list);
  32.         }
  33.   sock_handle=Get_Icmp_Handle();
  34.   if(sock_handle<0) return 0;
  35.   Set_Time_Out(sock_handle,3000);

  36.         int    pack_len;
  37. #ifdef LINUX_SYS
  38.   socklen_t from_size;
  39. #else
  40.   int from_size;
  41. #endif

  42.   unsigned char icmp_data[30],pack_data[512];
  43.   TNetProt send_pack;
  44.   int bytes;
  45.   unsigned int pid,recvpid;
  46.   unsigned long timeid,recvtimeid;

  47.   memset(icmp_data,0,sizeof(icmp_data));

  48.   #define ICMP_ECHO 8

  49.         send_pack.mPack.Icmp_Type = ICMP_ECHO;                        // then fill in the data.
  50.         send_pack.mPack.Icmp_Code = 0;                                                        // Use the Sockman instance
  51.   send_pack.mPack.Icmp_Data = icmp_data;
  52.   send_pack.mPack.Icmp_Data_Len = 8;

  53.   pid=(unsigned int)getpid();

  54.   icmp_data[0]=(unsigned char)((pid>;>;8)&0xff);
  55.   icmp_data[1]=(unsigned char)(pid&0xff);


  56.   timeid =(unsigned long)GetTickCount();
  57.   icmp_data[2] = (unsigned char)((timeid>;>;24)&0xff);
  58.   icmp_data[3] = (unsigned char)((timeid>;>;16)&0xff);
  59.   icmp_data[4] = (unsigned char)((timeid>;>;8)&0xff);
  60.   icmp_data[5] = (unsigned char)((timeid)&0xff);

  61.   send_pack.Pack_Ip_Icmp(pack_data,&pack_len);

  62.   bytes = sendto(sock_handle, (char *)pack_data, pack_len,
  63.                                                         0, (struct        sockaddr *) &where_to, sizeof(where_to));
  64.         if (bytes != pack_len)
  65.         {
  66.     Close_Handle(sock_handle);
  67.                 return 0;
  68.   }

  69.   from_size=sizeof(where_from);
  70.   while(1)
  71.   {
  72.     bytes = recvfrom(sock_handle, (char *)pack_data, 512,
  73.                                                         0, (struct        sockaddr *) &where_from, &from_size);
  74.     if(bytes<=0)
  75.     {
  76.       Close_Handle(sock_handle);
  77.       return 0;
  78.     };
  79.     if(!send_pack.Unpack_Ip(pack_data,bytes))
  80.     {
  81.       Close_Handle(sock_handle);
  82.       puts("unpack ip data fail");
  83.       return 0;
  84.     };
  85.     if(send_pack.mPack.Icmp_Data_Len<8)
  86.       continue;
  87.     recvpid=send_pack.mPack.Icmp_Data[0];
  88.     recvpid<<=8;
  89.     recvpid+=send_pack.mPack.Icmp_Data[1];
  90.     if(recvpid!=pid)
  91.       continue;
  92.     recvtimeid=send_pack.mPack.Icmp_Data[2];
  93.     recvtimeid<<=8;
  94.     recvtimeid+=send_pack.mPack.Icmp_Data[3];
  95.     recvtimeid<<=8;
  96.     recvtimeid+=send_pack.mPack.Icmp_Data[4];
  97.     recvtimeid<<=8;
  98.     recvtimeid+=send_pack.mPack.Icmp_Data[5];
  99.     if(recvtimeid!=timeid)
  100.       continue;
  101.     break;
  102.   };
  103.   Close_Handle(sock_handle);
  104.   /*
  105.   printf("from %15s ttl %3d icmp type %2d code %2d used %d\n",
  106.       send_pack.mPack.Ip_Src,
  107.       send_pack.mPack.Ip_Ttl,
  108.       send_pack.mPack.Icmp_Type,
  109.       send_pack.mPack.Icmp_Code,
  110.       (unsigned long)GetTickCount()-recvtimeid);
  111.   */
  112.   if(send_pack.mPack.Icmp_Type!=0||send_pack.mPack.Icmp_Code!=0)
  113.     return 0;
  114.   if(time_used!=NULL)
  115.     *time_used=(unsigned long)GetTickCount()-recvtimeid;
  116.   return 1;
  117. };
复制代码

论坛徽章:
0
5 [报告]
发表于 2003-02-21 22:53 |只看该作者

请教一个可以并发执行的ping程序

多谢楼上的鼎立相助
小弟万分感激!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP