文件名称:一个判断远程主机存活程序代码

  • 所属分类:
  • Internet/网络编程
  • 资源属性:
  • [Text]
  • 上传时间:
  • 2009-05-29
  • 文件大小:
  • 5.74kb
  • 下载次数:
  • 0次
  • 提 供 者:
  • shuiyuan313
  • 相关连接:
  • 下载说明:
  • 别用迅雷下载,失败请重下,重下不扣分!

介绍说明--下载内容均来自于网络,请自行研究使用

一个判断远程主机存活程序代码(ping)
#include
#include
#include
#include
#include "winsock.h"
#pragma comment(lib,"Ws2_32");

#define SEND_SIZE 32
#define PACKET_SIZE 4096
#define ICMP_ECHO 8
#define ICMP_ECHOREPLY 0

struct icmp
{
unsigned char icmp_type;
unsigned char icmp_code;
unsigned short icmp_cksum;
unsigned short icmp_id;
unsigned short icmp_seq;
unsigned long icmp_data;
};

struct ip
{
  unsigned char ip_hl:4;   
unsigned char ip_v:4;    
  unsigned char ip_tos;     
  unsigned short ip_len;    
  unsigned short ip_id;     
  unsigned short ip_off;    
  unsigned char ip_ttl;     
  unsigned char ip_p;     
  unsigned short ip_sum;    
  unsigned long ip_src;
  unsigned long ip_dst; 
};

unsigned char sendpacket[PACKET_SIZE];
unsigned char recvpacket[PACKET_SIZE];
struct sockaddr_in dest_addr;
struct sockaddr_in from_addr;
int sockfd;
int pid;

unsigned short cal_chksum(unsigned short *addr,int len);
int pack(int pack_no);
int unpack(unsigned char *buf,int len);
void send_packet(void);
void recv_packet(void);

void main(int argc,char *argv[])
{   
struct hostent *host;
  struct protoent *protocol;
WSADATA wsaData;
int timeout=1000;
int SEND_COUNT=4;
int i;
char *par_host;

par_host=argv[argc-1];        //IP赋值

switch(argc)
{
case 2: break;
case 3: if(strcmp(argv[1],"-t")==0)
  {
  SEND_COUNT=10000;
  break;
  }
  //fall through
default:
 printf("usage: %s [-t] Host name or IP address\n",argv[0]);
 exit(1);    
}

if(WSAStartup(0x1010,&wsaData)!=0)
{
 printf("wsastartup error\n");
 exit(1);
}
  if( (protocol=getprotobyname("icmp") )==NULL)
{
 printf("getprotobyname error\n");
    exit(1);
  }
/*
printf("%s\n",protocol->p_name);
printf("%s\n",protocol->p_aliases);
printf("%d\n",protocol->p_proto);
system("pause");
*/
  if( (sockfd=socket(AF_INET,SOCK_RAW,protocol->p_proto) )<0)
  { 
 printf("socket error\n");
    exit(1);
  }
  if(setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout))h_length);
 //resolve address to hostname
 if(host=gethostbyaddr(host->h_addr,4,PF_INET))
  par_host=host->h_name;
    //
        //printf("%s\n",par_host);
        //
}
  else if( dest_addr.sin_addr.s_addr=inet_addr(par_host)==INADDR_NONE)
{
 printf("Unkown host %s\n",par_host);
 exit(1);
}

   
  pid=getpid();
    /*
    printf("%d\n",pid);
    system("pause");
    */    
  printf("Pinging %s [%s]: with %d bytes of data:\n\n",par_host,inet_ntoa(dest_addr.sin_addr),SEND_SIZE);          
for(i=0;i1)
  {    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 pack(int pack_no)
{   
int packsize;
  struct icmp *icmp;

  packsize=8+SEND_SIZE;
  icmp=(struct icmp*)sendpacket;
  icmp->icmp_type=ICMP_ECHO;
  icmp->icmp_code=0;
  icmp->icmp_cksum=0;
  icmp->icmp_seq=pack_no;
  icmp->icmp_id=pid;
  icmp->icmp_data=GetTickCount();
  icmp->icmp_cksum=cal_chksum( (unsigned short *)icmp,packsize); /*校验算法*/
  return packsize;
}

//解包
int unpack(unsigned char *buf,int len)
{   
  struct ip *ip;
  struct icmp *icmp;
  double rtt;
int iphdrlen;

  ip=(struct ip *)buf;
  iphdrlen=ip->ip_hl*4;  
  icmp=(struct icmp *)(buf+iphdrlen);     
  if( (icmp->icmp_type==ICMP_ECHOREPLY) && (icmp->icmp_id==pid) )
  {
 len=len-iphdrlen-8; 
 rtt=GetTickCount()-icmp->icmp_data; 
   printf("Reply from %s: bytes=%d time=%.0fms TTL=%d icmp_seq=%u\n",      
       inet_ntoa(from_addr.sin_addr),
  len,
  rtt,
  ip->ip_ttl,
       icmp->icmp_seq);
 return 1;
  }
return 0;
}

//发送
void send_packet()
{ 
  int packetsize;
  static int pack_no=0;
  
  packetsize=pack(pack_no++);
  if( sendto(sockfd,(char *)sendpacket,packetsize,0,(struct sockaddr *)&dest_addr,sizeof(dest_addr) )=0)
  success=unpack(recvpacket,n);
 else if (WSAGetLastError() == WSAETIMEDOUT)
 {
  printf("Request timed out.\n");
  return;
 }
}while(!success);

}
UID5380 帖子239 精华0 积分1289 阅读权限40 来自软件学院 在线时间81 小时 注册时间2006-5-22 最后登录2007-2-24 查看详细资料
TOP


(系统自动生成,下载前可以参看下载内容)

下载文件列表

压缩包 : icmp.txt 列表

相关说明

  • 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
  • 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度更多...
  • 请直接用浏览器下载本站内容,不要使用迅雷之类的下载软件,用WinRAR最新版进行解压.
  • 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
  • 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
  • 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.

相关评论

暂无评论内容.

发表评论

*主  题:
*内  容:
*验 证 码:

源码中国 www.ymcn.org