- 论坛徽章:
- 0
|
请教一个可以并发执行的ping程序
- /*
- 函数功能:ping一个ip或主机,ping的原理是:发送icmp数据包,
- 接受网络返回的ip数据包,分析是否能达。注意在互联网上一次调用可能不通,
- 应采用多次来判断是否可达
- 传入参数:
- host_name: 要ping的主机名或ip地址
- time_used: 返回实际使用的毫秒数
- 返回参数:
- 可达:1
- 不可达:0
- */
- int TNetTool::Ping(char * host_name,int * time_used)
- {
- int sock_handle;
- struct hostent * hp;
- struct sockaddr_in where_from,where_to;
- if(host_name==NULL) return 0;
- memset(&where_from, 0, sizeof(where_from));
- memset(&where_to, 0, sizeof(where_to));
- where_to.sin_family = AF_INET;
- where_to.sin_addr.s_addr = inet_addr(host_name);
- if ((int)where_to.sin_addr.s_addr == -1)
- {
- hp = gethostbyname(host_name);
- if(hp==NULL)
- {
- printf("gethostbyname fail: %s\n",host_name);
- return 0;
- };
- where_to.sin_family = hp->;h_addrtype;
- where_to.sin_addr = *((in_addr *) *hp->;h_addr_list);
- }
- sock_handle=Get_Icmp_Handle();
- if(sock_handle<0) return 0;
- Set_Time_Out(sock_handle,3000);
- int pack_len;
- #ifdef LINUX_SYS
- socklen_t from_size;
- #else
- int from_size;
- #endif
- unsigned char icmp_data[30],pack_data[512];
- TNetProt send_pack;
- int bytes;
- unsigned int pid,recvpid;
- unsigned long timeid,recvtimeid;
- memset(icmp_data,0,sizeof(icmp_data));
- #define ICMP_ECHO 8
- send_pack.mPack.Icmp_Type = ICMP_ECHO; // then fill in the data.
- send_pack.mPack.Icmp_Code = 0; // Use the Sockman instance
- send_pack.mPack.Icmp_Data = icmp_data;
- send_pack.mPack.Icmp_Data_Len = 8;
- pid=(unsigned int)getpid();
- icmp_data[0]=(unsigned char)((pid>;>;8)&0xff);
- icmp_data[1]=(unsigned char)(pid&0xff);
- timeid =(unsigned long)GetTickCount();
- icmp_data[2] = (unsigned char)((timeid>;>;24)&0xff);
- icmp_data[3] = (unsigned char)((timeid>;>;16)&0xff);
- icmp_data[4] = (unsigned char)((timeid>;>;8)&0xff);
- icmp_data[5] = (unsigned char)((timeid)&0xff);
- send_pack.Pack_Ip_Icmp(pack_data,&pack_len);
- bytes = sendto(sock_handle, (char *)pack_data, pack_len,
- 0, (struct sockaddr *) &where_to, sizeof(where_to));
- if (bytes != pack_len)
- {
- Close_Handle(sock_handle);
- return 0;
- }
- from_size=sizeof(where_from);
- while(1)
- {
- bytes = recvfrom(sock_handle, (char *)pack_data, 512,
- 0, (struct sockaddr *) &where_from, &from_size);
- if(bytes<=0)
- {
- Close_Handle(sock_handle);
- return 0;
- };
- if(!send_pack.Unpack_Ip(pack_data,bytes))
- {
- Close_Handle(sock_handle);
- puts("unpack ip data fail");
- return 0;
- };
- if(send_pack.mPack.Icmp_Data_Len<8)
- continue;
- recvpid=send_pack.mPack.Icmp_Data[0];
- recvpid<<=8;
- recvpid+=send_pack.mPack.Icmp_Data[1];
- if(recvpid!=pid)
- continue;
- recvtimeid=send_pack.mPack.Icmp_Data[2];
- recvtimeid<<=8;
- recvtimeid+=send_pack.mPack.Icmp_Data[3];
- recvtimeid<<=8;
- recvtimeid+=send_pack.mPack.Icmp_Data[4];
- recvtimeid<<=8;
- recvtimeid+=send_pack.mPack.Icmp_Data[5];
- if(recvtimeid!=timeid)
- continue;
- break;
- };
- Close_Handle(sock_handle);
- /*
- printf("from %15s ttl %3d icmp type %2d code %2d used %d\n",
- send_pack.mPack.Ip_Src,
- send_pack.mPack.Ip_Ttl,
- send_pack.mPack.Icmp_Type,
- send_pack.mPack.Icmp_Code,
- (unsigned long)GetTickCount()-recvtimeid);
- */
- if(send_pack.mPack.Icmp_Type!=0||send_pack.mPack.Icmp_Code!=0)
- return 0;
- if(time_used!=NULL)
- *time_used=(unsigned long)GetTickCount()-recvtimeid;
- return 1;
- };
复制代码 |
|