//PING.C
#include <stdio.h>
#include <stdlib.h>
#include <Winsock.h>
#include "Ping.h"
#include <string.h>
//函数声明
void Ping(LPCSTR pstrHost,int n);
void ReportError(LPCSTR pstrFrom);//处理错误
int WaitForEchoReply(SOCKET s);
u_short in_cksum(u_short *addr,int len);
//ICMP回送请求和应答函数声明
int SendEchoRequest(SOCKET,LPSOCKADDR_IN);//发送报文请求
DWORD RecvEchoReply(SOCKET,LPSOCKADDR_IN,u_char*);//接受报文信息
///////////////////////////////////////////////////
//主程序
void main(int argc,char**argv)
{
WSADATA wsaData;
WORD wVersionRequested=MAKEWORD(1,1); /////套接字版本号
int nRet;
int n;
//命令行参数检查
if(argc!=3)
{
fprintf(stderr,"\nUsage:ping hostname n \n");
return;
}
//初始化Winsock
nRet=WSAStartup(wVersionRequested,&wsaData);
if(nRet)
{
fprintf(stderr,"\nError initializing Winsock\n");
return;
}
//Winsock版本检查
if(wsaData.wVersion!=wVersionRequested)
{
fprintf(stderr,"\nWinsock version not supported\n");
return;
}
//调用PING函数
n=atoi(argv[1]);
Ping(argv[2],n);
//释放Winsock
WSACleanup();
}
//////////////////////////////////////////////
//Ping()函数
//调用SendEchoRequest()和RecvEchoReply()函数
//并输出结果
void Ping(LPCSTR pstrHost,int n)
{
SOCKET rawSocket;
LPHOSTENT IpHost;
struct sockaddr_in saDest;
struct sockaddr_in saSrc;
DWORD dwTimeSent;
DWORD dwElapsed;
u_char cTTL;
int nLoop;
int nRet;
int sensum=0;
int recvsum=0;
DWORD max=0,min=888888,sum=0;
static ECHOREPLY echoReply;
static ECHOREQUEST echoReq;
//创建一个原始套接口
rawSocket=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
if(rawSocket==SOCKET_ERROR)
{
ReportError("socket()");
return ;
}
//根据主机名查询主机地址
IpHost=gethostbyname(pstrHost);
if(IpHost==NULL)
{
fprintf(stderr,"\nTimeout:%s\n",pstrHost);
return;
}
//设置目标套接口地址
saDest.sin_addr.s_addr=*((u_long FAR*)(IpHost->h_addr));
saDest.sin_family=AF_INET;
saDest.sin_port=0;
//输出Ping程序的提示信息,例如进行本机Ping时,输出:
//Pinging localhost【127.0.0.1】with 32 bytes of data:
printf("\nPinging %s[%s]with %d bytes of data:\n",
pstrHost,
inet_ntoa(saDest.sin_addr),
REQ_DATASIZE); /*回送数据长度*/
//控制ping执行的次数p
for(nLoop=0;nLoop<n;nLoop++)
{
//发送ICMP回送请求
SendEchoRequest(rawSocket,&saDest);
nRet=sendto(rawSocket,(LPSTR)&echoReq,sizeof(ECHOREQUEST),0,(struct sockaddr *)&saDest,sizeof(saDest));
if(nRet==SOCKET_ERROR)
ReportError("sento()");
else
sensum=sensum+1;
//使用select()等待接收回送的数据
nRet=WaitForEchoReply(rawSocket);
if(nRet==SOCKET_ERROR)
{
ReportError("select()");
break;
}
if(!nRet)
{
printf("\nTimeOut");//输出超时提示
break;
}
//接收应答
dwTimeSent=RecvEchoReply(rawSocket,&saSrc,&cTTL);
//计算传输时间,并输出提示信息。如:
//Reply from:127.0.0.1:bytes=32 time=0ms TTL=128
dwElapsed=GetTickCount()-dwTimeSent;
if(max<dwElapsed)
max=dwElapsed;
if(min>dwElapsed)
min=dwElapsed;
sum+=dwElapsed;
printf("\nReply from:%s;bytes=%d time=%ldms TTL=%d",
inet_ntoa(saSrc.sin_addr),
REQ_DATASIZE,
dwElapsed,
cTTL);
recvsum++;
}
int avg=(sensum-recvsum)/sensum*100;
DWORD Average=sum/n;
printf("\n");
printf("\n");
printf("ping statistics for %s:",inet_ntoa(saSrc.sin_addr));
printf("\n Packets:Sent = %d, Recvived = %d, Lost = %d ,<%d%% loss>",sensum,recvsum,sensum-recvsum,avg);
printf("\nApproximate round trip times in milli_seconds:");
printf("\n minimum = %ldms, maximum = %ldms, Average = %ldms",min,max,Average);
printf("\n");
nRet=closesocket(rawSocket);
if(nRet==SOCKET_ERROR)
ReportError("closesocket()");
}
//////////////////////////////////////////////////////
//SendEchoRequst()
//给目标站点发送回送请求
int SendEchoRequest(SOCKET s,LPSOCKADDR_IN lpstToAddr)
{
static ECHOREQUEST echoReq;
static nId=1;
static nSeq=1;
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));
//发送回送请求
nRet=sendto(s,(LPSTR)&echoReq,sizeof(ECHOREQUEST),0,(LPSOCKADDR)lpstToAddr,sizeof(SOCKADDR_IN));
if(nRet==SOCKET_ERROR)
ReportError("sento()");
return (nRet);
}
//////////////////////////////////////////////////////////
//RecvechoReply()
//接收数据并对字段进行分析
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("recvfrom()");
//返回发送时间的IP生存时间TTL
*pTTL=echoReply.ipHdr.TTL;
return (echoReply.echoRequest.dwTime);
}
//////////////////////////////////////////////////////////
//ReportError()
//输出发生的错误
void ReportError(LPCSTR pWhere)
{
fprintf(stderr,"\n%s error:%d\n",WSAGetLastError());
}
////////////////////////////////////////////////////////
//WaitForEchoReply()
//使用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;
return (select(1,&readfds,NULL,NULL,&Timeout));
}
////////////////////////////////////////////////////////
//in_cksum()
//计算校验和
u_short in_cksum(u_short *addr,int len)
{
register int nleft=len;
register u_short *w=addr;
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);
}
没有合适的资源?快使用搜索试试~ 我知道了~
ping程序设计和文件传输协议的简单设计
共42个文件
pdb:6个
opt:4个
pch:3个
4星 · 超过85%的资源 需积分: 10 71 下载量 184 浏览量
2008-12-21
21:29:14
上传
评论 1
收藏 3.51MB RAR 举报
温馨提示
PING程序是我们使用的比较多的用于测试网络连通性的程序。课程设计中选取PING程序的设计,其目的是希望同学们通过PING程序的设计,能初步掌握TCP/IP网络协议的基本实现方法,对网络的实现机制有进一步的认识。 文件传输协议的简单设计与实现:用socket 编程接口编写两个程序,分别为客户程序(client.c)和服务器程序(server.c),该程序应能实现下述命令功能: get:取远方的一个文件 put:传给远方一个文件 。。。。。。 包括源程序和可运行的exe文件,绝对可以运行
资源推荐
资源详情
资源评论
收起资源包目录
ping程序和ftp.rar (42个子文件)
ping
pingd.opt 48KB
d.cpp 6KB
Debug
pingd.pch 3.4MB
vc60.pdb 76KB
pingd.pdb 457KB
vc60.idb 209KB
d.obj 21KB
pingd.ilk 193KB
pingd.exe 172KB
ping.h 1KB
pingd.dsw 518B
pingd.dsp 4KB
pingd.plg 1KB
d'.h 1KB
pingd.ncb 49KB
ftp
sever
Sever.opt 48KB
Sever.cpp 5KB
Debug
Sever.pdb 473KB
Sever.pch 3.39MB
vc60.pdb 76KB
vc60.idb 209KB
Sever.ilk 213KB
Sever.obj 24KB
Sever.exe 180KB
Sever.plg 244B
Sever.ncb 41KB
Sever.dsw 518B
Sever.dsp 3KB
client
Client.dsp 3KB
Client.ncb 49KB
Client.plg 246B
Debug
Client.exe 224KB
vc60.pdb 84KB
Client.pdb 553KB
Client.pch 3.46MB
vc60.idb 321KB
Client.ilk 266KB
Client.obj 30KB
Client.opt 43KB
Client.dsw 520B
Client.cpp 5KB
Client.opt 48KB
共 42 条
- 1
a123294
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页