社区
C++ 语言
帖子详情
求计算两IP之间往返时间(RTT)的源码或者程序,功能如Ping
zzyyjj
2005-03-15 08:13:22
如题,希望能将往返时间(RTT)存入文本文件
功能:运行xping 202.197.65.4 -t
能把本机到202.197.65.4的RTT都存入文本文件
...全文
502
6
打赏
收藏
求计算两IP之间往返时间(RTT)的源码或者程序,功能如Ping
如题,希望能将往返时间(RTT)存入文本文件 功能:运行xping 202.197.65.4 -t 能把本机到202.197.65.4的RTT都存入文本文件
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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网络编程问问可能更好一些。
原始套接字实现
Ping
命令和Tracert命令
采用C++语言,基于原始套接字实现了
Ping
和Tracert命令。...Tracert 命令是用
IP
生存
时间
(TTL) 字段和 ICMP 错误消息来确定从一个主机到网络上其他主机经过的每个路由器及每个跃点的
往返
时间
(
RTT
) 的命令行报告输出。
TCP/
IP
详解 卷1:协议--源代码
21.4.1
往返
时间
RTT
的测量 229 21.4.2
RTT
估计器的
计算
231 21.4.3 慢启动 233 21.5 拥塞举例 233 21.6 拥塞避免算法 235 21.7 快速重传与快速恢复算法 236 21.8 拥塞举例(续) 237 21.9 按每条...
linux下
ping
函数的
源码
,linux下
ping
命令的实现
源码
(转)
相信大家一定遇到过上不了网的情形,都知道用个
ping
命令。这不小王就是这样的女孩,老是上不了网,老是找我,我就先
ping
一下,逐步找找问题在哪儿,有的放矢,不至于盲目抓瞎(说心里话,我真不愿意帮小王弄,每次弄...
用C语言实现
Ping
命令
幸运的是对
Ping
的实现原理还是比较清楚的,难度和挑战皆在于网络编程方面的零基础,再加上现在的课程比较多,所以只能每天抽出一部分
时间
来学习所需的网络编程知识。大概会持续个
两
三周。既然如此,索性开个博客,...
《TCP/
IP
卷1》笔记:Traceroute
程序
Traceroute
程序
引言 Traceroute
程序
是了解TCP/
IP
...已经有了记录路由选项的
功能
还要单独开发一个Traceroute
程序
呢? 因为
IP
记录路由选项(RR),需要每个路由器把自己的
ip
放入选项字段,但是
IP
首部的选项字段最多只...
C++ 语言
64,649
社区成员
250,477
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章