求计算两IP之间往返时间(RTT)的源码或者程序,功能如Ping

zzyyjj 2005-03-15 08:13:22
如题,希望能将往返时间(RTT)存入文本文件

功能:运行xping 202.197.65.4 -t
能把本机到202.197.65.4的RTT都存入文本文件

...全文
502 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
BasicCAD 2005-03-16
  • 打赏
  • 举报
回复
请问我调试到setsockopt(sd,IPPROTO_IP, SO_SNDTIMEO,(const char*)&ttl,sizeof(ttl))时报出错误代码10042怎么解决?
zzyyjj 2005-03-16
  • 打赏
  • 举报
回复
谢谢
怎么把RTT存入文本文件?
1982pc 2005-03-16
  • 打赏
  • 举报
回复
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define MAX_PING_PACKET_SIZE 1024
#define ICMP_CEHO_REQUEST 8
#define PACKET_SIZE 32
#define xmalloc(s) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s))
typedef struct ICMP_HEADER
{
BYTE i_type;
BYTE i_code;
USHORT i_cksum;
USHORT i_id;
USHORT i_seq;
ULONG timestamp;
} ICMPHeader;
typedef struct IP_HEADER
{
unsigned int h_len:4; // length of the header
unsigned int version:4; // Version of IP
unsigned char tos; // Type of service
unsigned short total_len; // total length of the packet
unsigned short ident; // unique identifier
unsigned short frag_and_flags; // flags
unsigned char ttl;
unsigned char proto; // protocol (TCP, UDP etc)
unsigned short checksum; // IP checksum

unsigned int sourceIP;
unsigned int destIP;
}IPHeader;
USHORT checksum(USHORT *buffer, int size);
int inisocket()
{
WORD wVR=MAKEWORD(2,1);
WSADATA wsaDATA;
if(WSAStartup(wVR,&wsaDATA)!=0)//初始化套接字
{
cerr<<"Error"<<WSAGetLastError()<<"when ini"<<endl;
return 1;
}
return 0;
}
int allocate_buffers(ICMPHeader*& send_buf,IPHeader*& recv_buf,int packet_size)
{
send_buf=(ICMPHeader*)new char[packet_size];
if(send_buf==0)
{
cerr<<"Failed to allocate buffer."<<endl;
return -1;
}
recv_buf=(IPHeader*) new char[MAX_PING_PACKET_SIZE];
if(recv_buf==0)
{
cerr<<"Failed to allocate output buffer."<<endl;
return -1;
}
return 0;
}
int setup_for_ping(char* host,int ttl, SOCKET& sd,sockaddr_in& dest)
{
sd=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,0,0,0);
if(sd ==INVALID_SOCKET)
{
cerr<<"Failed to create raw socket:"<<WSAGetLastError()<<endl;
return -1;
}
if(setsockopt(sd,IPPROTO_IP,SO_SNDTIMEO,(const char*)&ttl,sizeof(ttl))==SOCKET_ERROR)
{
cerr<<"TTL setsockopt failed:"<<WSAGetLastError()<<endl;
return -1;
}
memset(&dest,0,sizeof(dest));
unsigned int addr=inet_addr(host);
if(addr!=INADDR_NONE)
{
dest.sin_addr.s_addr=addr;
dest.sin_family=AF_INET;
}
else
{
hostent* hp=gethostbyname(host);
if(hp!=0)
{
memcpy(&(dest.sin_addr),hp->h_addr_list,hp->h_length);
dest.sin_family=hp->h_addrtype;
}
else
{
cerr<<"Failed to resolve"<<host<<endl;
return -1;
}
}
return 0;
}
void init_ping_packet(ICMPHeader* icmp_hdr,int packet_size,int seq_no)
{
icmp_hdr->i_type=ICMP_CEHO_REQUEST;
icmp_hdr->i_code=0;
icmp_hdr->i_cksum=0;
icmp_hdr->i_id=(USHORT)GetCurrentProcessId();
icmp_hdr->timestamp=GetTickCount();
const unsigned long int deadmeat=0xDEADBEEF;
char* datapart=(char*)icmp_hdr+sizeof(ICMPHeader);
int bytes_left=packet_size-sizeof(ICMPHeader);
while(bytes_left>0)
{
memcpy(datapart,&deadmeat,min(int(sizeof(deadmeat)),bytes_left));
bytes_left-=sizeof(deadmeat);
datapart+=sizeof(deadmeat);
}
icmp_hdr->i_cksum=checksum((USHORT*)icmp_hdr,packet_size);
}
int send_ping(SOCKET sd,const sockaddr_in& dest,char* send_buf,int packet_size)
{
cout<<"Sending"<<packet_size<<"bytes to"<<
inet_ntoa(dest.sin_addr)<<"..."<<flush;
int bwrote=sendto(sd,send_buf,packet_size,0,
(sockaddr*)&dest,sizeof(dest));
if(bwrote==SOCKET_ERROR)
{
cerr<<"send failed:"<<WSAGetLastError()<<endl;
return -1;
}
else if(bwrote<packet_size)
{
cout<<"sent"<<bwrote<<"bytes..."<<flush;
}
return 0;
}
int recv_ping(SOCKET sd,sockaddr_in& source,char *recv_buf,int packet_size)
{
int fromlen=sizeof(source);
int bread=recvfrom(sd,recv_buf,packet_size+sizeof(IPHeader),
0,(sockaddr*) &source,&fromlen);
if(bread==SOCKET_ERROR)
{
cerr<<"read failed:";
if(WSAGetLastError()==WSAEMSGSIZE)
{
cerr<<"buffer too small"<<endl;
}
else
{
cerr<<"error #"<<WSAGetLastError()<<endl;
}
return -1;
}
return 0;
}
USHORT checksum(USHORT *buffer, int size) {

unsigned long cksum=0;

while(size >1) {
cksum+=*buffer++;
size -=sizeof(USHORT);
}

if(size ) {
cksum += *(UCHAR*)buffer;
}

cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
void main()
{
inisocket();
SOCKET sd;
sockaddr_in dest,source;
char *argv;
char *recv_buf;
char *send_buf;
int ttl=1000;
cout<<"Please input host:"<<endl;
cin>>argv;
if(setup_for_ping(argv,ttl,sd,dest)<0)
recv_buf = (char*)xmalloc(MAX_PING_PACKET_SIZE);
send_buf = (char*)xmalloc(MAX_PING_PACKET_SIZE);

init_ping_packet((ICMPHeader*) send_buf,PACKET_SIZE,0);
if(send_ping(sd,dest,send_buf,PACKET_SIZE)>=0)
{
while(1)
if(recv_ping(sd,source,recv_buf,MAX_PING_PACKET_SIZE)<0)
{
unsigned short header_len=((IPHeader*)recv_buf)->h_len*4;
ICMPHeader *icmphdr=(ICMPHeader*)(recv_buf+header_len);
if(icmphdr->i_seq!=0)
{
cerr<<"bad sequence number!"<<endl;
continue;
}
else
{
break;
}
}
}
WSACleanup();
}
piaozi2003 2005-03-16
  • 打赏
  • 举报
回复
ping程序的原理就是发送ICMP echo报文,在发送的报文的数据中存放发送请求的时间值,当应答返回时,用当前时间减去存放在ICMP报文中的时间值,由于ICMP报文首部有“序号”字段,还可以打印配套的数据报序列!

明白了原理编程应该不是很难了吧! 利用系统提供的API或者系统调用(一般叫Raw Socket)访问ICMP协议!
zzyyjj 2005-03-16
  • 打赏
  • 举报
回复
没有人会
fanofvc 2005-03-15
  • 打赏
  • 举报
回复
到vc/mfc网络编程问问可能更好一些。

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧