毕业论文论文范文课程设计实践报告法律论文英语论文教学论文医学论文农学论文艺术论文行政论文管理论文计算机安全
您现在的位置: 毕业论文 >> 课程设计 >> 正文

PING程序的设计 第2页

更新时间:2009-4-13:  来源:毕业论文
PING程序的设计 第2页
ping核心程序
void Ping(LPCSTR pstrHost)
{
 SOCKET rawSocket;
 LPHOSTENT lpHost;
 sockaddr_in saDest;
 sockaddr_in saSrc;
 DWORD dwTimeSent;
 DWORD dwElapsed;
 u_char cTTL;
 int nLoop;
 int nRet;
 //创建一个原始套接口
 rawSocket=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
 if(rawSocket==SOCKET_ERROR)
 {
  ReportError("socket()");
  return;
 }
    //根据主机名查询主机地址
 lpHost=gethostbyname(pstrHost);
 if(lpHost==NULL)
 {
  fprintf(stderr,"\nHost not found:%s\n");
  return;
 }//设置目标套接口地址
 saDest.sin_addr.s_addr=*((u_long FAR*)(lpHost->h_addr));
 saDest.sin_family=AF_INET;
 saDest.sin_port=0;
    //输出Ping程序的提示信息
 printf("\nPinging %s [%s] with %d bytes of data:\n",
  pstrHost,inet_ntoa(saDest.sin_addr),REQ_DATASIZE);
    //控制Ping执行的次数
 for(nLoop=0;nLoop<4;nLoop++)
 {
  SendEchoRequest(rawSocket,&saDest);//使用select()等待接收回送的数据
  nRet=WaitForEchoReply(rawSocket);
  if(nRet==SOCKET_ERROR)
  {
   ReportError("select()");
   break;
  }

  if(!nRet)
  {
   printf("\nTimeOut");//输出超时提示
   break;
  }
        //接收应答
  dwTimeSent=RecvEchoReply(rawSocket,&saSrc,&cTTL);//计算传输时间
  dwElapsed=GetTickCount()-dwTimeSent;
  printf("\nReply from:%s:bytes=%d time =%ld ms TTL=%d",
   inet_ntoa(saSrc.sin_addr),REQ_DATASIZE,dwElapsed,cTTL);
  printf("\n");
  
 }
 nRet=closesocket(rawSocket);
  if(nRet==SOCKET_ERROR)
  {
   ReportError("closesocket()");

  }

}

//////////////////////////////////////////////////////////////////////////////////////////////////////
int SendEchoRequest(SOCKET s,LPSOCKADDR_IN lpstToAddr)//给目标站点发送回送请求
{
 static ECHOREQUEST echoReq;
 static 751com.cn
 int nRet;
 //填写回送请求信息
 echoReq.icmpHdr.Type=ICMP_ECHOREQ;
 echoReq.icmpHdr.Code=0;
 echoReq.icmpHdr.Checksum=0;
 echoReq.icmpHdr.ID=nId++;
 echoReq.icmpHdr.Seq=nSeq++;
    //填写要发送的数据
 for(nRet=0;nRet<REQ_DATASIZE;nRet++)
  echoReq.cData[nRet]=' '+nRet;//保存发送时间
 echoReq.dwTime=GetTickCount();//数据存入包中并计算检验和
 echoReq.icmpHdr.Checksum=in_cksum((u_short*)&echoReq,sizeof(ECHOREQUEST));//发送回送请求
int nAddrLen=sizeof(struct sockaddr_in);
 nRet=sendto(s,(LPSTR)&echoReq,sizeof(ECHOREQUEST),0,(LPSOCKADDR)lpstToAddr,nAddrLen);
 if(nRet==SOCKET_ERROR)
  ReportError("sendto()");
 return(nRet);

}
//接收数据并对字段进行分析
DWORD RecvEchoReply(SOCKET s,LPSOCKADDR_IN lpsaFrom,u_char *pTTL)
{
 ECHOREPLY echoReply;
 int nRet;
 int nAddrLen=sizeof(struct sockaddr_in);//接收回送应答
 nRet=recvfrom(s,(LPSTR)&echoReply,sizeof(ECHOREPLY),0,(LPSOCKADDR)lpsaFrom,&nAddrLen);//检查返回值
 if(nRet==SOCKET_ERROR)
  ReportError("recvform()");
 *pTTL=echoReply.ipHdr.TTL;//返回发送时间的IP生存时间TTL
 return(echoReply.echoRequest.dwTime);
}
//输出发生的错误
void ReportError(LPCSTR pWhere)
{
 fprintf(stderr,"\n error:%d\n",WSAGetLastError());
}

//使用select()函数进行状态查询,以确定是否有数据等待读取
int WaitForEchoReply(SOCKET s)
{
 struct timeval Timeout;
 fd_set readfds;
 readfds.fd_count=1;
 readfds.fd_array[0]=s;
 Timeout.tv_sec=5;
 Timeout.tv_usec=0;
751com.cn
 register u_short answer;
 register int sum=0;
 while(nleft>1)
 {
  sum+=*w++;
  nleft-=2;
 }
 if(nleft==1)
 {
  u_short u=0;
  *(u_char*)(&u)=*(u_char*)w;
  sum+=u;
 }
 sum=(sum>>16)+(sum&0xffff);
 sum+=(sum>>16);
 answer=~sum;
 return(answer);
}

上一页  [1] [2] [3] 下一页

PING程序的设计 第2页下载如图片无法显示或论文不完整,请联系qq752018766
设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©751com.cn 辣文论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。