#include //校验和计算

unsigned short calc_cksum(char *buff,int len)

{

int blen = len;

unsigned short *mid = (unsigned short*)buff;

unsigned short te = 0;

unsigned int sum = 0;

while(blen > 1)

{

sum += *mid++;

blen -= 2;

}

if(blen == 1)

{

te = *(unsigned char*)mid;

te = (te << 8) & 0xff;

sum += te;

}

sum = (sum >> 16) + (sum&0xffff);

sum += sum >>16;

return (unsigned short)(~sum);

}

static void time_packet(char *buff,int len,int id,int seq)

{

time_t *ti;

struct icmp *icmp = (struct icmp*)buff;

struct timeval val;

icmp->icmp_type = 13; //Timestamp Request

icmp->icmp_code = 0;

icmp->icmp_cksum = 0; //first set zero

icmp->icmp_id = id & 0xffff;

icmp->icmp_seq = seq;

gettimeofday(&val,NULL);

//24*60*60 = 86400 自午夜开始计算的毫秒数

icmp->icmp_otime = htonl((val.tv_sec % 86400)*1000 + val.tv_usec / 1000);

icmp->icmp_rtime = 0;

icmp->icmp_ttime = 0;

//计算校验和

icmp->icmp_cksum = calc_cksum(buff,len);

return;

}

void parse_packet(char *buff,int len)

{

struct icmp *icmp;

struct iphdr *iphead = (struct iphdr *)buff;

struct in_addr addr;

addr.s_addr = iphead->saddr;

printf("comefrom ip=%s ",inet_ntoa(addr));

//跳过ip头

icmp = (struct icmp *)(buff+sizeof(struct iphdr));

//看传输回的包校验和是否正确

if(calc_cksum((char *)icmp,len-sizeof(sizeof(struct iphdr))) > 1)

{

printf("receiver error\n");

return;

}

printf("type=%d seq=%d id=%d pid=%d otime=%d rtime=%d ttime=%d\n",icmp->icmp_type,icmp->icmp_seq,icmp->icmp_id,(getpid()&0xffff),ntohl(icmp->icmp_otime),ntohl(icmp->icmp_rtime),ntohl(icmp->icmp_ttime));

}

int main(int argc,char *argv[])

{

int skfd;

struct sockaddr_in addr={0};

struct sockaddr_in saddr={0};

char buff[64]={0};

char recvbuff[512]={0};

int ret;

int addrlen = 0;

int count = 5;

int i = 1;

skfd = socket(PF_INET,SOCK_RAW,IPPROTO_ICMP);

if(skfd < 0)

{

printf("socket error\n");

return -1;

}

addr.sin_family = AF_INET;

addr.sin_addr.s_addr = inet_addr("192.168.21.244");

//每一秒发送一次 共发送count次

while(count > 0)

{

//序列号seq 从1 开始传输 buff的大小为64

memset(buff,0,sizeof(buff));

time_packet(buff,64,getpid(),i);

i++;

count --;

//将数据发送出去

ret = sendto(skfd,buff,64,0,(struct sockaddr *)&addr,sizeof(addr));

if(ret <= 0)

{

printf("send error\n");

goto out;

}

else

printf("send success ret=%d\n",ret);

//接收echo replay

memset(recvbuff,0,sizeof(recvbuff));

memset(&saddr,0,sizeof(saddr));

addrlen = sizeof(saddr);

ret = recvfrom(skfd,recvbuff,sizeof(recvbuff),0,(struct sockaddr *)&saddr,&addrlen);

if(ret <= 0)

{

printf("recv error\n");

continue;

}

parse_packet(recvbuff,ret);

sleep(2);

}

out:

close(skfd);

return 0;

}

linux icmp 时间戳过滤,ICMP-linux c 时间戳请求功能实现相关推荐

  1. linux 命令行 过滤,利用linux命令行工具进行文本行过滤

    在日常工作中会遇到需要筛选过滤要查看的日志等文本文件的任务,例如需要查看日志文件的最后几行等. 下面总结一下常见的对文本行过滤的方法. 常用命令行工具 接下来主要使用的是head,tail,sed和a ...

  2. imu与gps之间的时间戳_TCP 窗口缩放、时间戳和 SACK(2) | Linux 中国

    导读:有很多文章出于各种"性能调优"或"安全性"原因,建议禁用 TCP 扩展,本文提供了这些扩展功能的背景,为什么会默认启用,它们之间是如何关联的,以及为什么通 ...

  3. linux时间戳转换c语言,Unix时间戳和北京时间的相互转换(C语言实现 )

    一.问题背景 最近项目中需要上传包含时间戳的设备数据到服务器平台.原本想把"年","月","日","时","分 ...

  4. Linux·DNS协议、ICMP协议、NAT技术

    目录 DNS协议 DNS背景 ​编辑域名简介 域名解析过程 使用dig工具分析DNS过程 ICMP协议 ICMP功能 ICMP协议格式 ​编辑ping命令 一个值得注意的坑 traceroute命令 ...

  5. 计算机网络 day6 arp病毒 - ICMP协议 - ping命令 - Linux手工配置IP地址

    目录 arp协议 arp病毒\欺骗 arp病毒的运行原理 arp病毒产生的后果: 解决方法: ICMP协议 ICMP用在哪里? ICMP协议数据的封装过程 ​编辑 为什么icmp协议封装好数据后,还要 ...

  6. 易语言linux时间戳转换,生成时间戳(如何正确地生成时间戳)

    如何正确地生成时间戳 各种语言版本的时间戳 1.Swift NSDate().timeIntervalSince1970 2.Go int32(time.Now().Unix()) 3.Java (i ...

  7. Linux 使用grep过滤多个条件及grep常用过滤命令

    这篇文章主要介绍了Linux 使用grep筛选多个条件及grep常用过滤命令,需要的朋友可以参考下 cat log.txt | grep 条件: cat log.txt | grep 条件一 | gr ...

  8. linux grep文件过滤与分割命令

    linux grep文件过滤与分割命令 文章目录 linux grep文件过滤与分割命令 1.grep命令 选项 grep命令常见用法 grep递归搜索文件 2.split命令 选项 实例 3.loo ...

  9. linux操作系统 第02章 linux操作做基础

                                                                                       第2章    Linux操作基础 ...

  10. 用C语言实现linux的ping,用C语言实现Ping程序功能

    大部分人用ping命令只是作为查看另一个系统的网络连接是否正常的一种简单方法. 在这篇文章中,作者将介绍如何用C语言编写一个模拟ping命令功能的程序. ping命令是用来查看网络上另一个主机系统的网 ...

最新文章

  1. 导入Scrapy 项目报错:no module named scrapy
  2. ZOJ - 2955 Interesting Dart Game(鸽巢原理+完全背包)
  3. C++回声服务器_4-UDP connect版本客户端
  4. 对抗告警疲劳的8种方法
  5. 使用Excel VBA(快捷键)(加菜单)
  6. 从FTP下载文件带进度条
  7. 小程序入门学习16--上传小程序至github
  8. bp神经网络数字识别matlab_卷积神经网络学习识别手写数字时的可视化
  9. java动态代理实现与原理详细分析(【转载】By--- Gonjan )
  10. 查询MySQL中某个数据库中有多少张表
  11. 统计挖掘那些事(七)—— 如何直观地理解过拟合与欠拟合那些事~
  12. WebsResponse
  13. 每日英语:Targeting Grandpa: China’s Seniors Hunger for Ads
  14. ASP.NET动态网站开发培训-26.在线编辑器FreeTextBox的使用
  15. 软件测试工程师需要具备哪些能力?
  16. 非诚勿扰:比舒淇更孤单的是谁?
  17. 浏览器的input禁用输入法
  18. 计算机专业专科可以进的国企,专科学这四个专业!考国企、事业编制会容易很多...
  19. 畅捷通T+密码清除后,空密码无法登录账套解决办法
  20. 晕菜:新域名在60天内不能转移。

热门文章

  1. 初一上册计算机教案,人教版七年级上册信息技术教学设计
  2. 小米 秋招 笔试 编程题 句子反转
  3. 移动端 Retina屏 各大主流网站1px的解决方案
  4. topic是短语还是句子_词组、短语、句子--Unit 3 Topic 3
  5. linux 限制单个ip流量,centos 的单ip流量控制-CentOS下利用iptables限速及限制每IP连接数...
  6. 大学英语精读第二版(第五册)复习笔记——文章内容摘要
  7. 回顾一年的工作历程_但回首这一年来的工作经历
  8. python可以excel_python能处理excel吗
  9. 东方博易OJ——1002 - 【入门】编程求解1+2+3+...+n
  10. M1芯片MacBook安装手机app