ping源代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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;
nRet=sendto(s,(LPSTR)&echoReq,sizeof(ECHOREQUEST),0,(LPSOCKADDR)lpstToAd dr,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);//接收回送应答
REPLY FROM ΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ 或
REQUEST TimeOut (无法PING通的情况)。 三、 实验主要仪器设备和材料 联网计算机。 四、 实验方法、步骤及结构测试 实验按下述步骤进行: 1) 熟悉IP以及ICMP协议的工作机制 2) 熟悉RAW模式的SOCKET编程 3) 编写PING的实现程序 4) 编译环境中需要包括SOCKET库 WS2_32.lib 5) 在模拟实现环境下调试并运行自己编写的PING程序
熟悉SOCKET的编程,包括基本的系统调用如SOCKET、BIND等; 2、具体内容 1) 定义数据结构 需要定义好IP数据报、ICMP包等相关的数据结构; 2) 程序实现 在WINDOWS环境下实现PING程序; 3) 程序要求
在命令提示符下输入: PING ΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ
其中ΧΧΧ为目的主机的IP地址,不要求支持域名,对是否带有开关变量也不做要 求。不带开关变量时,要求返 回4次响应。 返回信息的格式:
} nRet=closesocket(rawSocket); if(nRet==SOCKET_ERROR) {
ReportError("closesocket()");
}
}
int SendEchoRequest(SOCKET s,LPSOCKADDR_IN lpstToAddr)//给目标站点发送回 送请求 {
版社.2001
PING程序的设计 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; //创建一个原始Βιβλιοθήκη Baidu接口 rawSocket=socket (AF_INET,SOCK_RAW,IPPROTO_ICMP); if(rawSocket==SOCKET_ERROR) {
{ 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; lwfree.cn register u_short answer; register int sum=0; while(nleft>1) {
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");
static ECHOREQUEST echoReq;
static lwfree.cn int nRet; //填写回送请求信息 echoReq.icmpHdr.Type=ICMP_ECHOREQ; echoReq.icmpHdr.Code=0; echoReq.icmpHdr.Checksum=0; echoReq.icmpHdr.ID=nId++; echoReq.icmpHdr.Seq=nSeq++;
PING程序的设计
一、 实验目的 PING程序是我们使用的比较多的用于测试网络连通性的程序。PING程序基于ICMP, 使用ICMP的回送请求和回送应答来工作。由计算机网络课程知道,ICMP是基于IP的 一个协议,ICMP包通过IP的封装之后传递。 课程设计中选取PING程序的设计,其目的是希望同学们通过PING程序的设计,能初 步掌握TCP/IP网络协议的基本实现方法,对网络的实现机制有进一步的认识。 二、 实验内容和要求 1、RAW模式的SOCKET编程 PING程序是面向用户的应用程序,该程序使用ICMP的封装机制,通过IP协议来工作。 为了实现直接对IP和ICMP包进行操作,实验中使用RAW模式的SOCKET编程。 熟悉SOCKET的编程,包括基本的系统调用如SOCKET、BIND等; 2、具体内容 1) 定义数据结构 需要定义好IP数据报、ICMP包等相关的数据结构; 2) 程序实现 在WINDOWS环境下实现PING程序; 3) 程序要求 在命令提示符下输入:
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); }
PING ΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ 其中ΧΧΧ为目的主机的IP地址,不要求支持域名,对是否带有开关变量也不做要 求。不带开关变量时,要求返 回4次响应。 返回信息的格式:
REPLY FROM ΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ 或
REQUEST TimeOut (无法PING通的情况)。 三、 实验主要仪器设备和材料 联网计算机。 四、 实验方法、步骤及结构测试 实验按下述步骤进行: 1) 熟悉IP以及ICMP协议的工作机制 2) 熟悉RAW模式的SOCKET编程 3) 编写PING的实现程序 4) 编译环境中需要包括SOCKET库 WS2_32.lib 5) 在模拟实现环境下调试并运行自己编写的PING程序 六、 应收集的资料及主要参考文献 1. 程良伦主编,《网络工程概论》,机械工业出版社. 2007 2. 苏峰,黄金双,汤蕾编著,《Visual C++.NET编程实例》,清华大学出版社.2004 3. 黄嘉辉编著,《Internet与TCP/IP程序设计之C++ Builder高手》,清华大学出
//填写要发送的数据 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=recvfrom(s,(LPSTR)&echoReply,sizeof(ECHOREPLY),0,(LPSOCKADDR)lpsaFr om,&nAddrLen); 检查返回值
if(nRet==SOCKET_ERROR) ReportError("recvform()"); *pTTL=echoReply.ipHdr.TTL;//返回发送时间的IP生存时间TTL return(echoReply.echoRequest.dwTime); } //输出发生的错误 void ReportError(LPCSTR pWhere)
//输出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) {
PING程序的设计|网络概论课程设计报告|报 告 ping实验结果 在命令行输入如下信息,进行本机测试: >Ping 127.0.0.1
输出结果为:
如果输入: >Ping www.751com.cn 输出结果为:
如果输入: >Ping 192.168.1.168 输出结果为:
5 总结 本次课程设计较好地实现了要求做到的功能, 但同时也遇到了不少的困难和挑战。 通过这次设计,我不但加深了对SOCKET的原始套接字RAW编程的理解,同时也对IP 和ICMP协议有了进一步 的认识。这次设计的主要难点,在于数据包的发送接收,TTL的计算,以及超时的 判断。 通过这次课程设计,我了解到自己在ICMP协议方面还有很多不足,在完成实验的过 程中老师给了我很大的帮助 和鼓励,使我能够很好的完成这次实验。 文献 1.程良伦主编,《网络工程概论》,机械工业出版社. 2007 2.苏峰,黄金双,汤蕾编著,《Visual C++.NET编程实例》,清华
相关文档
最新文档