TCP协议学习记录 (一) ICMP时间戳请求
程序只实现了获取时间戳,至于将时间戳转换成具体日期和时间,暂时没有好的办法。
#define TIME_STAMP_REQUEST 13 struct iphdr
{
unsigned char ip_hdr_len : ; //包头长度
unsigned char ip_version : ; //版本
unsigned char ip_tos; unsigned short ip_length; //总长度
unsigned short ip_identify;//标识
unsigned short ip_offset;//片偏移
unsigned char ip_ttl;
unsigned char ip_protocol;
unsigned short ip_cksum; struct in_addr ip_src; //源地址
struct in_addr ip_dst; //目的地址
}; struct icmphdr
{
unsigned char icmp_type; //8位类型
unsigned char icmp_code; //8位代码
unsigned short icmp_cksum; //16位的校验和 unsigned short icmp_identify;
unsigned short icmp_seq; unsigned int icmp_otime;
unsigned int icmp_rtime; //接收时间
unsigned int icmp_ttime; //应答时间
}; unsigned short checksum(int count,unsigned short* addr)
{
long sum = ; while(count > )
{
sum +=*addr++;
count -= sizeof(unsigned short);
} if(count > )
{
sum +=*(unsigned char*)addr;
} while(sum >> )
{
sum = (sum & 0xFFFF) + (sum >> );
} return (unsigned short)(~sum);
} bool timestamp_request(char * argv)
{
WSADATA wsaData;
WSAStartup(MAKEWORD(, ), &wsaData); SOCKET soc = socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
if(soc == -)
{
printf("create raw socket failed!\n");
return false;
} struct sockaddr_in addrsrv; addrsrv.sin_family = AF_INET;
addrsrv.sin_port = htons();
addrsrv.sin_addr.s_addr = inet_addr("202.112.10.36"); //预设地址 struct hostent* phostent = gethostbyname(argv);
if (phostent)
{
addrsrv.sin_addr.s_addr = *(u_long *)phostent->h_addr_list[];;
} printf("sending timestamp request to host [%s]\n",inet_ntoa(addrsrv.sin_addr)); icmphdr ihdr = {}; ihdr.icmp_type = TIME_STAMP_REQUEST;
ihdr.icmp_identify = (unsigned short)GetCurrentProcessId();
ihdr.icmp_cksum = checksum(sizeof(icmphdr),(unsigned short *)&ihdr); if(sendto(soc,(char *)&ihdr,sizeof(ihdr),,(sockaddr *)&addrsrv,sizeof(addrsrv)) == -)
{
printf("send icmp packet failed!\n");
return false;
} struct sockaddr_in addrcli; int nlength = sizeof(addrcli);
char recv[MAXBYTE] = {}; struct timeval timeout;
timeout.tv_sec = ;
timeout.tv_usec = ;
setsockopt(soc, SOL_SOCKET,SO_RCVTIMEO, (char*)&timeout,sizeof(timeout)); if(recvfrom(soc,recv,MAXBYTE,,(sockaddr *)&addrcli,&nlength) == -)
{
printf("recv ip packet failed!\n");
return false;
} iphdr* piphdr = (iphdr *)recv;
if(checksum(piphdr->ip_hdr_len << 2,(unsigned short *)piphdr) != )
{
printf("invalid ip packet!\n");
return false;
} icmphdr* pichdr = (icmphdr *)(piphdr + );
if(checksum(sizeof(icmphdr),(unsigned short *)pichdr) != )
{
printf("invalid icmp packet!\n");
return false;
} printf("recv time:[%u] transmit time:[%u]\n",ntohl(pichdr->icmp_rtime),ntohl(pichdr->icmp_ttime)); return true;
} int main(int argc,char * argv[])
{
if(argc < )
{
return ;
} timestamp_request(argv[]);
}
TCP协议学习记录 (一) ICMP时间戳请求的更多相关文章
- TCP协议学习记录 (三) Ping程序 RR选项 记录路由hop
一开始想直接在上个程序改,自己构造IP包头,但后来发现不行,微软不让干了,所以后来选用libcap库来收发包 代码写的很乱.. #pragma pack(4) #define ECHO_REQUEST ...
- TCP协议学习记录 (二) Ping程序
简单的实现了一个ping程序,没有做icmp差错报文的检查. 支持自定义字节数,支持发包个数 #pragma pack(4) #define ECHO_REQUEST 8 #define DATASI ...
- TCP协议学习总结(上)
在计算机领域,数据的本质无非0和1,创造0和1的固然伟大,但真正百花齐放的还是基于0和1之上的各种层次之间的组合(数据结构)所带给我们人类各种各样的可能性.例如TCP协议,我们的生活无不无时无刻的站在 ...
- TCP协议学习总结(中)
很多人都说TCP协议是一个十分复杂的协议,在学习当中,我对协议每一个问题都分解学习后,每一个分解我都能体会和理解它的要点,并不难理解.但我把这些拆分的细节合并后,确认感觉这样一个协议相对“臃肿”但又好 ...
- 计算机网络:这是一份全面 & 详细 的TCP协议学习指南
原文链接:blog.csdn.net 用这个媒体播放器组件,实时互动时也可共同观看本地视频juejin.im 前言 计算机网络基础 该是程序猿需掌握的知识,但往往会被忽略 今天,我将详细讲解计算机网络 ...
- TCP协议学习
一.TCP参考模型 VS OSI参考模型 二.TCP/IP分层模型的四个协议层分别完成以下的功能 第一层 网络接口层 网络接口层包括用于协作IP数据在已有网络介质上传输的协议.实际上TCP/IP标准 ...
- TCP协议学习笔记(一)首部以及TCP的三次握手连接四次挥手断开
TCP协议是一种面向连接的.可靠的流协议. 流即不间断的数据结构.这样能够保证接收到数据顺序与发送相同.但是犹如数据间没有间隔,因此在TCP通信中,发送端应用可以在自己所要发送的消息中设置一个标示长度 ...
- TCP协议学习笔记
TCP协议数据格式 TCP协议在互联网ISO协议的传输层. 在互联网传输过程中,互联网包在数据链路层,是传输数据的最基础的包.一个互联网的包包含IP包,即互联网包 = 互联网信息包头(至少20字节)+ ...
- TCP协议学习总结
1.TCP协议通过三次握手建连接,四次挥手断连接. 2.TCP的定时器都有哪些? 做什么用途? 3.TCP的慢启动是什么意思? 4.TCP的快速重传是什么意思?
随机推荐
- JQUERY DIALOG窗格内不能使用FORM
今天在做AJAX DIALOG数据提交实验,实验目的是,在DIALOG内显示另一页面,并将FORM组件信息提交保存至数据库.代码如下: DIALOG实现: function OpenDialog(ur ...
- 9. js实现java方法:HtmlUtils.htmlEscape()
function htmlEscape(str) { return String(str) .replace(/&/g, '&') .replace(/"/g, '" ...
- Docker学习过程中遇到的问题及解决方法
1.重新安装Docker后,运行不起来 [root@zyt-test-14-53 ~]# docker infoCannot connect to the Docker daemon. Is the ...
- 关键字extern
extern 可以置于 变量 或 函数 前, 以表明变量 或 函数 的定义在别的文件中, 下面代码用到的这些变量 或 函数是外来的, 不是本文件定义的, 提示链接器遇到此变量和函数时在 ...
- delphi IOS 获取电池信息
procedure TDeviceInfoForm.btnGetDeviceInfoClick(Sender: TObject); var Device : UIDevice; begin Devic ...
- 《SSM框架搭建》三.整合spring web
感谢学习http://blog.csdn.net/zhshulin/article/details/37956105#,还是修改了spring到最新的版本和接口开发示例 根据前一篇日志,已经有了myb ...
- python基础知识7——迭代器,生成器,装饰器
迭代器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器 ...
- WCF 服务调用 QueryRun
通过AX2012的WCF服务调用AX2012的方法时,如果方法里调用了QueryRun对象时,会报错,报错信息如下:System.ServiceModel.FaultException: 无法将类型为 ...
- 第一个PHP程序-HelloWorld
<?php //echo输出字符串 echo "Hello php!你好 php" ; 以上程序输出结果为:Hello php!你好 php
- Hadoop 调研笔记
由于从各光伏电站采集的数据量较大,必须解决海量数据的查询.分析的问题.目前主要考虑两种方式:1. Hadoop大数据技术:2. Oracle(数据仓库)+BI: 本文仅介绍hadoop的技术 ...