-
获取网络包到达网卡的时间
2014-03-27 11:01:04为啥要获取数据包到达网卡的时间? 在回答这个问题之前,我们先看一下网卡... 现在假设:消息处理服务处理网络消息包的平均时间为1s,请求方等待回包的时间为1s,网卡消息队列的长度为10,在应用程序正常处理的情况为啥要获取数据包到达网卡的时间?
在回答这个问题之前,我们先看一下网卡消息队列。如下图所示,对端发送的网络数据包被网卡设备接收到之后,会存放到网卡消息队列中,由应用程序调用recv系列函数从网卡队列中获取网络消息。现在假设:消息处理服务处理网络消息包的平均时间为1s,请求方等待回包的时间为1s,网卡消息队列的长度为10,在应用程序正常处理的情况下,所有的请求均能够在规定的时间内接收到回包。但是消息处理服务(即recv调用者)在处理某个数据包时发生异常,导致处理耗时3s,这时网卡消息队列中保存了2个数据包。此时消息处理服务恢复正常,再次从网卡消息队列中获取到的数据包已将是3s之前的请求包,而且请求方已经等待超时,继续处理这个请求已经没有任何的实际意义,正确的处理方式为:从网卡消息队列获取消息时,同时获取消息到达网卡的时间,检查消息是否超时,超时的消息直接丢弃或者记录日志等操作,然后继续处理消息队列中剩余的消息。下面介绍几种获取网络包到达网卡时间的方法:方法一:搭建接口机搭建接口机调用recv系列函数,从网卡消息队列中获取消息,打上时间戳再存放到消息队列中,由消息处理服务来从应用消息队列中取出消息进行处理。整体架构图如下:因为接口机的服务功能比较简单,从网卡中获取时间的时间,就可以当作网络包到达网卡的时间。其实,接口服务与逻辑服务的架构比较常见,但是采用这种方法来解决获取时间的问题,显然成本比较高,非常不合适。方法二:ioctl获取网卡时间ioctl可以根据socket句柄来查询这个句柄获取传递给用户的最后一个包到达网卡的时间,即获取最后一次调用recv系列函数获取到的数据包到达网卡的时间戳。现在存在一个场景,如何获取这个句柄接收到的每个数据的网卡时间?每次调用recv系列函数之后, 均需要再调用一次ioctl。在调用ioctl的过程中,第一次调用ioctl返回的是gettimeofday的时间,后续获取到的时间是正常的数据包到达网卡的时。示例代码:Server代码(C):- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <string.h>
- #include <stdio.h>
- #include <stdint.h>
- #include <sys/ioctl.h>
- #include <sys/time.h>
- #define PORT 31500
- int main(){
- int sockfd,len;
- struct sockaddr_in addr;
- int addr_len = sizeof(struct sockaddr_in);
- char buffer[256];
- if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0){
- perror ("socket");
- exit(1);
- }
- bzero ( &addr, sizeof(addr) );
- addr.sin_family=AF_INET;
- addr.sin_port=htons(PORT);
- addr.sin_addr.s_addr=htonl(INADDR_ANY) ;
- if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr))<0){
- perror("connect");
- exit(1);
- }
- struct timeval tv, tvNow,tvRes;
- while(1){
- bzero(buffer,sizeof(buffer));
- len = recvfrom(sockfd,buffer,sizeof(buffer), 0 , (struct sockaddr *)&addr ,(socklen_t*)&addr_len);
- printf("receive from %s\n" , inet_ntoa( addr.sin_addr));
- int iRet = ioctl(sockfd, SIOCGSTAMP, &tv);
- gettimeofday(&tvNow, NULL);
- uint64_t ddwNow = tvNow.tv_sec*1000000 + tvNow.tv_usec;
- uint64_t ddwTv = tv.tv_sec*1000000 + tv.tv_usec;
- printf("Now:%lu Tv:%lu dff:%lu\n",ddwNow,ddwTv,(ddwNow - ddwTv)/1000000);
- sleep(10);
- }
- return 0;
- }
Client代码(Python):- import socket
- address = ('127.0.0.1',31500)
- s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
- while True:
- msg = raw_input()
- if not msg:
- break
- s.sendto(msg,address)
- s.close()
使用该策略的缺点在于:为获取到时间戳需要产生额外的一次系统调用:ioctl,降低了系统的性能。方法三相对更加高效简单,在获取到网络数据包的同时获取到网络数据包到达网卡的时间。方法三:recvmsg获取网卡时间使用recvmsg函数,调整所需要获取的控制消息,即可获取到网络包到达网卡的时间戳Server代码(C):- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <string.h>
- #include <stdio.h>
- #include <stdint.h>
- #include <sys/ioctl.h>
- #include <sys/time.h>
- #define SERVPORT 31500
- int main(int argc, char **argv)
- {
- int sockfd;
- struct sockaddr_in srvAddr;
- sockfd = socket(AF_INET ,SOCK_DGRAM,0 );
- if(sockfd< 0 )
- {
- printf("socket error\n");
- return 0;
- }
- bzero(&srvAddr, sizeof(srvAddr) );
- srvAddr.sin_family = AF_INET;
- srvAddr.sin_port = htons(SERVPORT);
- srvAddr.sin_addr.s_addr = htonl(INADDR_ANY);
- bind(sockfd, (struct sockaddr*)&srvAddr,sizeof(srvAddr));
- while(1)
- {
- struct msghdr msg;
- struct sockaddr_in clientAddr;
- msg.msg_name = &clientAddr;
- msg.msg_namelen= sizeof(clientAddr);
- struct iovec iov;
- msg.msg_iov = &iov;
- msg.msg_iovlen =1;
- char text[1024] ;
- iov.iov_base= text;
- iov.iov_len = sizeof(text);
- char ctrl[CMSG_SPACE(sizeof(struct timeval))];
- struct cmsghdr *cmsg=(struct cmsghdr*)&ctrl;
- msg.msg_control = (caddr_t)ctrl;
- msg.msg_controllen = sizeof(ctrl);
- int rc = recvmsg(sockfd,&msg,0);
- if(rc== -1)
- {
- printf("recvmsg error\n");
- return 0;
- }
- struct timeval tv, tvNow,tvRes;
- if(cmsg->cmsg_level ==SOL_SOCKET&&
- cmsg->cmsg_type ==SCM_TIMESTAMP &&
- cmsg->cmsg_len ==CMSG_LEN(sizeof(tv))
- )
- memcpy(&tv,CMSG_DATA(cmsg),sizeof(tv));
- gettimeofday(&tvNow, NULL);
- uint64_t ddwNow = tvNow.tv_sec*1000000 + tvNow.tv_usec;
- uint64_t ddwTv = tv.tv_sec*1000000 + tv.tv_usec;
- printf("Now:%lu Tv:%lu dff:%lu\n",ddwNow,ddwTv,(ddwNow - ddwTv)/1000000);
- sleep(10);
- }
- }
-
【Android】获取app的打包时间
2016-05-13 10:28:20分享是让牛逼的人更牛逼。 做有质量技术交流平台,闲话少说~ 欢迎进群交流,群号 414302560 ...所以如果能够在线下的版本中显示app的打包时间,这样就能节省好多不必要的沟通。 上代码。原理是获得打包签名文件的生成分享是让牛逼的人更牛逼。
做有质量技术交流平台,闲话少说~
欢迎进群交流,群号 414302560
初学者勿扰,谢谢~很多时候,发个包给测试,明明修复了bug,但却一直在说”我这还不行”。很多时候由于版本没有变更,很难判断当前正在运行的app是不是最新的打包产物。所以如果能够在线下的版本中显示app的打包时间,这样就能节省好多不必要的沟通。
上代码。原理是获得打包签名文件的生成时间。
/** * 获得app的打包时间 * * @return */ private String getAppBuildTime() { String result = ""; try { ApplicationInfo ai = getPackageManager().getApplicationInfo(getPackageName(),0); ZipFile zf = new ZipFile(ai.sourceDir); ZipEntry ze = zf.getEntry("META-INF/MANIFEST.MF"); long time = ze.getTime(); SimpleDateFormat formatter = (SimpleDateFormat) SimpleDateFormat.getInstance(); formatter.applyPattern("yyyy/MM/dd HH:mm:ss"); result = formatter.format(new java.util.Date(time)); zf.close(); } catch (Exception e) { } return result; }
上述方法貌似在5.0之后不好用,所以现在建议使用Gradle生成打包时间,然后再引用。核心代码如下:
buildTypes { release { buildConfigField("String", "releaseTime", "\""+new Date().format("yyyy/MM/dd HH:mm:ss")+"\"") minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } .... }
主要是使用buildConfigField生成打包时间。
然后使用 TextView.setText(BuildConfig.releaseTime); -
android获取手机应用的名称、图标、包名、安装时间以及更新时间
2018-03-28 14:26:20android获取手机应用的名称、图标、包名、安装时间以及更新时间 -
ASP.NET获取当前时间,包含各种时间格式
2020-09-09 09:16:45在c# / ASP.net中我们可以通过使用DataTime这个类来获取当前的时间。通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04)、时间(12:12:12)、日期+时间(2008-09-04 12:11:10)等。 //获取...没有在原贴中找到转载链接,这里就不放了,想看原帖的可以在“博客园”搜
在c# / ASP.net中我们可以通过使用DataTime这个类来获取当前的时间。通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04)、时间(12:12:12)、日期+时间(2008-09-04 12:11:10)等。
//获取日期+时间
DateTime.Now.ToString(); // 2008-9-4 20:02:10
DateTime.Now.ToLocalTime().ToString(); // 2008-9-4 20:12:12//获取日期
DateTime.Now.ToLongDateString().ToString(); // 2008年9月4日
DateTime.Now.ToShortDateString().ToString(); // 2008-9-4
DateTime.Now.ToString(“yyyy-MM-dd”); // 2008-09-04
DateTime.Now.Date.ToString(); // 2008-9-4 0:00:00
//获取时间
DateTime.Now.ToLongTimeString().ToString(); // 20:16:16
DateTime.Now.ToShortTimeString().ToString(); // 20:16
DateTime.Now.ToString(“hh:mm:ss”); // 08:05:57
DateTime.Now.TimeOfDay.ToString(); // 20:33:50.7187500//其他
DateTime.ToFileTime().ToString(); // 128650040212500000
DateTime.Now.ToFileTimeUtc().ToString(); // 128650040772968750
DateTime.Now.ToOADate().ToString(); // 39695.8461709606
DateTime.Now.ToUniversalTime().ToString(); // 2008-9-4 12:19:14DateTime.Now.Year.ToString(); 获取年份 // 2008
DateTime.Now.Month.ToString(); 获取月份 // 9
DateTime.Now.DayOfWeek.ToString(); 获取星期 // Thursday
DateTime.Now.DayOfYear.ToString(); 获取第几天 // 248
DateTime.Now.Hour.ToString(); 获取小时 // 20
DateTime.Now.Minute.ToString(); 获取分钟 // 31
DateTime.Now.Second.ToString(); 获取秒数 // 45//n为一个数,可以数整数,也可以事小数
dt.AddYears(n).ToString(); //时间加n年
dt.AddDays(n).ToString(); //加n天
dt.AddHours(n).ToString(); //加n小时
dt.AddMonths(n).ToString(); //加n个月
dt.AddSeconds(n).ToString(); //加n秒
dt.AddMinutes(n).ToString(); //加n分示例:
-
java工具包 获取时间/时间转时间戳/时间戳转换时间/剩余时间
2020-11-19 15:02:57DayTimeUtils .Class public class DayTimeUtils { /** * 获取本日剩余 秒 * * @return 时间戳/1000 ... // 得到今天 晚上的最后一刻 最后时间 String last = getTime() + " 23:59:59"; DateTimeFormatter fmDayTimeUtils .Class
public class DayTimeUtils { /** * 获取本日剩余 秒 * * @return 时间戳/1000 */ public static int getLastSeconds() { // 得到今天 晚上的最后一刻 最后时间 String last = getTime() + " 23:59:59"; DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime parse = LocalDateTime.parse(last, fmt); long latDate = parse.toInstant(ZoneOffset.ofHours(8)).toEpochMilli(); // 得到的毫秒 除以1000转换 为秒 return (int) (latDate - System.currentTimeMillis()) / 1000; } /** * 获取时间 yyyy-MM-dd * * @return 时间 */ public static String getTime() { LocalDate now = LocalDate.now(); DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd"); return now.format(fmt); } /** * 获取时间 yyyy-MM-dd HH:mm:ss * * @return */ public static String getTimeTo() { LocalDateTime now = LocalDateTime.now(); DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); return now.format(fmt); } /** * 时间戳转日期/时间 * * @param seconds 时间戳 * @param pattern 格式 * @return */ public static String timeStamp2Date(long seconds, String pattern) { String time = "暂无数据"; if (TextUtils.isEmpty(pattern)) pattern = "yyyy-MM-dd HH:mm:ss"; LocalDateTime dateTime = LocalDateTime.ofEpochSecond(seconds / 1000L, 0, ZoneOffset.ofHours(8)); if (seconds != 0) time = dateTime.format(DateTimeFormatter.ofPattern(pattern)); return time; } /** * 日期/时间转时间戳 * * @param date 时间 * @param pattern 格式 * @return */ public static long date2TimeStamp(String date, String pattern) { long timeStamp; if (TextUtils.isEmpty(pattern)) pattern = "yyyy-MM-dd HH:mm:ss"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); LocalDateTime localDateTime = LocalDateTime.parse(date, formatter); timeStamp = localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli(); return timeStamp; } }
-
ASP.Net 获取当前时间,包含各种时间格式
2015-07-14 11:39:54在c# / ASP.net中我们可以通过使用DataTime这个类来获取当前的时间。通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04)、时间(12:12:12)、日期+时间(2008-09-04 12:11:10)等。 //获取... -
rtp包获取绝对时间,不是时间差
2015-12-08 13:59:06协议里说第二个32位是时间戳,但又说第一包时间戳是随机的,那我如何才能取到这一包数据的绝对时间呢?比如说2015-12-08 10:10:10,望大神赐教,不胜感激! -
Java jsp界面获取获取当前系统时间的详细代码(包含了三个txt文档,提供了三种方式)
2013-03-09 16:10:40Java jsp界面获取获取当前系统时间的详细代码(包含了三个txt文档,提供了三种获取时间的方发) -
java8 time包获取指定日期时间
2020-06-19 17:30:44但是有时候需要获取生活中的一些指定日期时间,如获取固定的每月几日或者每周周几,这样的场景;of()方法就捉襟见肘了。 不要着急,LocalDateTime还提供了一个 with() 方法,能够方便的达到以上目的。 先看举例: ... -
Java&Android获取当前日期、时间、星期几、获取指定格式的日期时间、时间戳工具类包含使用示例
2020-03-02 11:09:44获取当前日期、获取当前时间、获取指定格式的日期时间、时间戳 代码如下,复制粘贴改包名即可使用, package com.llw.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.... -
golang time 获取昨天时间_关于golang的time包总结
2020-12-17 12:56:28golang提供了import "time"包用来处理时间相关操作,找到合适的api可以高效的处理时间,找到正确的使用方式可以少出bug。可以去百度【2020 年的第一天,程序员鸭血粉丝又碰上生产事故:... -
iOS ipa包编译时间获取
2018-08-31 16:37:50__LINE__:调用该宏语句所在的行数,是个十...__TIME__:当前编译的文件的编译时间 调用方式 NSString *buildDate = [NSString stringWithFormat:@"%s %s",__DATE__, __TIME__]; 或 NSString *build... -
iOS swift 获取 app 打包时间 版本 手机系统
2018-03-26 16:47:48因为提交给测试的测试包太多 出问题的包可能会混 所以加了个打包时间 和其他的一些app 和手机信息 方便测试在提BUG的时候带上1. 在 Xcode 工程对应 Target 的 build Phases 中新增 run Scrpit Phase2 创建 build... -
获取系统当前毫秒值转化为时间,将字符串转化为时间,将util包下的Date转化为Sql包下的Date
2019-12-05 16:21:14获取系统当前毫秒值转化为时间,将字符串转化为时间获取系统当前毫秒值转化为时间字符串将字符串格式化为想要的日期格式,将util包下的Date转化为Sql包下的Date 获取系统当前毫秒值转化为时间字符串 //计算机的底层... -
JAVA获取两个日期之间的所有日期(包含开始时间和结束时间)
2018-12-12 10:24:36* @description: 获取两个日期之间的所有日期(参数及返回日期均为字符串格式) * @param startTime 开始日期 * @param endTime 结束日期 * @return List<String> 日期集合 * @throws Parse... -
java 根据时间 获取时间的天数、包含闰年和不闰年
2016-09-30 11:41:00为什么80%的码农都做不了架构师?>>> ... -
杂项包含时间日期的设置,url内容获取
2018-02-26 23:27:36<?.../** * Created by PhpStorm. * User: Administrator * Date: 2018/2/26 * Time: 22:08 ...//利用setTime()设置时间 $d = new DateTime(); $d ->setDate(2016,2,3); $d->setTime(10... -
golang cron包 获取上上次执行时间
2019-08-15 17:19:45计划是统计 上次触发 到 现在 这个时间段之间的某些信息,我本以为使用cron的Prev就能很好的实现,但是测试时发现Prev的时间几乎就是本次执行的时间。 代码是这样的: func main() { cronSpec:= "0 */1 * * * ?" ... -
通过CURL获取站点的各类响应时间(DNS查询时间、SSL时间、首包时间等)
2018-12-05 10:41:16由于我们拥有较多的服务器,因而如何尽快地知道服务器上的某项服务是否挂了就是一个运维人员需要解决的问题。基本的想法就是开发一个监控服务,我将其取名ServerDog,设置Service模块,其会按照设定的频率与各种服务... -
java 获取包路径_java获取java文件路径的四种方法
2021-02-12 16:12:39java获取java文件路径的四种方法发布时间:2020-04-17 11:03:45来源:亿速云阅读:750作者:小新今天小编给大家分享的是java获取java文件路径的四种方法,很多人都不太了解,今天小编为了让大家更加了解获取java文件... -
Android 下获取各个包的信息
2015-04-18 21:39:23Android 下获取各个包的信息...自己在写东西的时候需要获取到手机上所有包的安装时间、使用次数、使用时长、最后一次启动的时间等等信息。 百度谷歌良久,终于完成。 android里是有获取这些数据所需要的包的,分别是: ... -
python 获取两个时间段之间的每一天的list(月日为个位数的情况,包含0/不包含0)
2019-03-15 20:47:471. 需求:获取两个时间段之间的每一天的list(月日为个位数的情况,包含0) import pandas as pd import datetime, time def deal(begin_date, end_date): date_list = [] begin_date = datetime.datetime.strptime... -
Python获取实时的时间
2021-01-12 15:35:46添加库 pip install datetime 参考代码 import datetime # 获取当前时间, 其中中包含了year, ...# 获取今天的时间 2021-01-12 15:30:39.603681 nowtime = datetime.datetime.now() print(today) print(nowtime) # -
python获取计算机时间_python怎么获取系统当前的时间
2020-12-02 10:37:49python获取系统当前的时间的方法:可以利用datetime.datetime.now()函数来获取。具体方法:1、导入datetime...具体方法:1、导入包import datetime2、获取当前的时间curr_time = datetime.datetime.now() # 2019-07... -
海康机器人线激光立体相机获取体积测量开始时间点和结束测量时间点以及包裹四个顶角位置信息的可行办法
2020-12-08 22:08:48简介:一种使用349体积相机获取体积测量开始时间点和结束测量时间点以及包裹四个顶角位置信息的可行办法。 本文档适用的问题 体积相机型号为:MV-DL2040-04B-H、MV-DL2025-04D-H、MV-DL2025-04H-H 项目中存在... -
渠道包的的渠道信息获取优化
2018-07-05 13:48:05前段时间后端的同学比较有空,所以他先做了渠道包的方案。 V1的签名,在META-INF目录下添加空文件(考虑到游戏也可能会在ZIP Comment) V2的签名,就参考美团的方案(增加一个自定义的key,不会和游戏的方案冲突)...
-
Linux下安装Nginx
-
安卓开发软件!掌握这十个搜索技巧让你的工作效率至上提高十倍!BAT大厂面试总结
-
MySQL 查询与高级查询(多表、嵌套和正则表达式)
-
html5+css3学习(八)之背景
-
flutter dio 调用api 与引用convert转json的使用
-
ROS_机械臂_个人资料.rar
-
C/C++:小球下落问题求解.rar(含完整注释)
-
2.4: 配置Linux网络 、 源码编译安装 、 自定义Yum仓库 、 日志管理(1).docx
-
《文件和目录操作命令》
<2.> -
记录第一次面试(阿里)
-
Java ConcurrentModificationException异常原因和解决方法
-
C# 高级网络编程及RRQMSocket框架详解
-
ESXI670_Build13473784 By SPK.iso
-
PowerBI重要外部工具详解
-
同学你要的最新真正的四六级真题 10年真题 包括听力 四级词汇 六级词汇 最后三天通关技巧
-
洗碗机品牌十大排行榜,火星人洗碗机怎么样?对比过后我选“它”
-
html5+css3学习(七)之定位
-
QT编程思想【C++,基于QT 6】
-
MySQL 函数、用户自定义函数
-
安卓手机系统开发!2021年你与字节跳动只差这份笔记,已拿到offer