精华内容
下载资源
问答
  • 为啥要获取数据包到达网卡的时间?  在回答这个问题之前,我们先看一下网卡... 现在假设:消息处理服务处理网络消息包的平均时间为1s,请求方等待回包的时间为1s,网卡消息队列的长度为10,在应用程序正常处理的情况
    为啥要获取数据包到达网卡的时间?
    
           在回答这个问题之前,我们先看一下网卡消息队列。如下图所示,对端发送的网络数据包被网卡设备接收到之后,会存放到网卡消息队列中,由应用程序调用recv系列函数从网卡队列中获取网络消息。


           现在假设:消息处理服务处理网络消息包的平均时间为1s,请求方等待回包的时间为1s,网卡消息队列的长度为10,在应用程序正常处理的情况下,所有的请求均能够在规定的时间内接收到回包。但是消息处理服务(即recv调用者)在处理某个数据包时发生异常,导致处理耗时3s,这时网卡消息队列中保存了2个数据包。此时消息处理服务恢复正常,再次从网卡消息队列中获取到的数据包已将是3s之前的请求包,而且请求方已经等待超时,继续处理这个请求已经没有任何的实际意义,正确的处理方式为:从网卡消息队列获取消息时,同时获取消息到达网卡的时间,检查消息是否超时,超时的消息直接丢弃或者记录日志等操作,然后继续处理消息队列中剩余的消息。

           下面介绍几种获取网络包到达网卡时间的方法:
           方法一:搭建接口机
           搭建接口机调用recv系列函数,从网卡消息队列中获取消息,打上时间戳再存放到消息队列中,由消息处理服务来从应用消息队列中取出消息进行处理。整体架构图如下:


           因为接口机的服务功能比较简单,从网卡中获取时间的时间,就可以当作网络包到达网卡的时间。
          其实,接口服务与逻辑服务的架构比较常见,但是采用这种方法来解决获取时间的问题,显然成本比较高,非常不合适。

          方法二:ioctl获取网卡时间
          ioctl可以根据socket句柄来查询这个句柄获取传递给用户的最后一个包到达网卡的时间,即获取最后一次调用recv系列函数获取到的数据包到达网卡的时间戳。现在存在一个场景,如何获取这个句柄接收到的每个数据的网卡时间?每次调用recv系列函数之后, 均需要再调用一次ioctl。
         在调用ioctl的过程中,第一次调用ioctl返回的是gettimeofday的时间,后续获取到的时间是正常的数据包到达网卡的时。
     示例代码:
    Server代码(C):
    1. #include <sys/socket.h>   
    2. #include <netinet/in.h>   
    3. #include <arpa/inet.h>   
    4. #include <unistd.h>   
    5. #include <stdlib.h>   
    6. #include <string.h>   
    7. #include <stdio.h>   
    8. #include <stdint.h>  
    9. #include <sys/ioctl.h>  
    10. #include <sys/time.h>  
    11. #define PORT 31500  
    12.   
    13. int main(){   
    14.      int sockfd,len;   
    15.      struct sockaddr_in addr;   
    16.      int addr_len = sizeof(struct sockaddr_in);   
    17.      char buffer[256];   
    18.   
    19.      if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0){   
    20.           perror ("socket");   
    21.           exit(1);   
    22.      }   
    23.   
    24.      bzero ( &addr, sizeof(addr) );   
    25.      addr.sin_family=AF_INET;   
    26.      addr.sin_port=htons(PORT);   
    27.      addr.sin_addr.s_addr=htonl(INADDR_ANY) ;   
    28.      if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr))<0){   
    29.           perror("connect");   
    30.           exit(1);   
    31.      }   
    32.      struct timeval tv, tvNow,tvRes;  
    33.      while(1){   
    34.           bzero(buffer,sizeof(buffer));   
    35.           len = recvfrom(sockfd,buffer,sizeof(buffer), 0 , (struct sockaddr *)&addr ,(socklen_t*)&addr_len);   
    36.           printf("receive from %s\n" , inet_ntoa( addr.sin_addr));   
    37.           int iRet = ioctl(sockfd, SIOCGSTAMP, &tv);  
    38.           gettimeofday(&tvNow, NULL);  
    39.           uint64_t ddwNow = tvNow.tv_sec*1000000 + tvNow.tv_usec;  
    40.           uint64_t ddwTv = tv.tv_sec*1000000 + tv.tv_usec;  
    41.   
    42.           printf("Now:%lu Tv:%lu dff:%lu\n",ddwNow,ddwTv,(ddwNow - ddwTv)/1000000);  
    43.           sleep(10);  
    44.      }   
    45.      return 0;  
    46. }    


    Client代码(Python):
    1. import socket  
    2. address = ('127.0.0.1',31500)  
    3. s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  
    4. while True:  
    5.      msg = raw_input()  
    6.      if not msg:  
    7.           break  
    8.      s.sendto(msg,address)  
    9.   
    10. s.close()  



    使用该策略的缺点在于:为获取到时间戳需要产生额外的一次系统调用:ioctl,降低了系统的性能。方法三相对更加高效简单,在获取到网络数据包的同时获取到网络数据包到达网卡的时间。


    方法三:recvmsg获取网卡时间
    使用recvmsg函数,调整所需要获取的控制消息,即可获取到网络包到达网卡的时间戳
    Server代码(C):
    1. #include <sys/socket.h>  
    2. #include <netinet/in.h>  
    3. #include <arpa/inet.h>  
    4. #include <unistd.h>  
    5. #include <stdlib.h>  
    6. #include <string.h>  
    7. #include <stdio.h>  
    8. #include <stdint.h>  
    9. #include <sys/ioctl.h>  
    10. #include <sys/time.h>  
    11. #define SERVPORT 31500  
    12.   
    13. int main(int argc, char **argv)   
    14. {   
    15.      int sockfd;   
    16.      struct sockaddr_in srvAddr;   
    17.      sockfd = socket(AF_INET ,SOCK_DGRAM,0 );   
    18.      if(sockfd< 0 )   
    19.      {   
    20.           printf("socket error\n");   
    21.           return 0;   
    22.      }      
    23.   
    24.      bzero(&srvAddr, sizeof(srvAddr) );   
    25.      srvAddr.sin_family = AF_INET;   
    26.      srvAddr.sin_port   = htons(SERVPORT);   
    27.      srvAddr.sin_addr.s_addr = htonl(INADDR_ANY);   
    28.   
    29.      bind(sockfd, (struct sockaddr*)&srvAddr,sizeof(srvAddr));   
    30.   
    31.      while(1)   
    32.      {      
    33.           struct msghdr msg;   
    34.   
    35.           struct sockaddr_in clientAddr;   
    36.           msg.msg_name = &clientAddr;   
    37.           msg.msg_namelen= sizeof(clientAddr);   
    38.   
    39.           struct iovec iov;   
    40.           msg.msg_iov = &iov;   
    41.           msg.msg_iovlen =1;   
    42.           char text[1024] ;   
    43.           iov.iov_base= text;   
    44.           iov.iov_len = sizeof(text);   
    45.   
    46.           char ctrl[CMSG_SPACE(sizeof(struct timeval))];   
    47.           struct cmsghdr *cmsg=(struct cmsghdr*)&ctrl;   
    48.           msg.msg_control = (caddr_t)ctrl;   
    49.           msg.msg_controllen = sizeof(ctrl);   
    50.   
    51.           int rc = recvmsg(sockfd,&msg,0);   
    52.           if(rc== -1)   
    53.           {   
    54.                printf("recvmsg error\n");   
    55.                return 0;   
    56.           }   
    57.   
    58.           struct timeval tv, tvNow,tvRes;  
    59.   
    60.           if(cmsg->cmsg_level ==SOL_SOCKET&&   
    61.                     cmsg->cmsg_type  ==SCM_TIMESTAMP &&   
    62.                     cmsg->cmsg_len   ==CMSG_LEN(sizeof(tv))   
    63.             )   
    64.           memcpy(&tv,CMSG_DATA(cmsg),sizeof(tv));   
    65.           gettimeofday(&tvNow, NULL);  
    66.           uint64_t ddwNow = tvNow.tv_sec*1000000 + tvNow.tv_usec;  
    67.           uint64_t ddwTv = tv.tv_sec*1000000 + tv.tv_usec;  
    68.   
    69.           printf("Now:%lu Tv:%lu dff:%lu\n",ddwNow,ddwTv,(ddwNow - ddwTv)/1000000);  
    70.           sleep(10);  
    71.      }   
    72. }   
    展开全文
  • 【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获取手机应用名称、图标、名、安装时间以及更新时间
  • 在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:14

    DateTime.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分

    示例:
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • DayTimeUtils .Class public class DayTimeUtils { /** * 获取本日剩余 秒 * * @return 时间戳/1000 ... // 得到今天 晚上最后一刻 最后时间 String last = getTime() + " 23:59:59"; DateTimeFormatter fm

    DayTimeUtils .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;
        }
    }
    
    展开全文
  • 在c# / ASP.net中我们可以通过使用DataTime这个类来获取当前的时间。通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04)、时间(12:12:12)、日期+时间(2008-09-04 12:11:10)等。 //获取...
  • 协议里说第二个32位是时间戳,但又说第一时间戳是随机,那我如何才能取到这一数据绝对时间呢?比如说2015-12-08 10:10:10,望大神赐教,不胜感激!
  • Java jsp界面获取获取当前系统时间的详细代码(包含了三个txt文档,提供了三种获取时间的方发)
  • 但是有时候需要获取生活中一些指定日期时间,如获取固定每月几日或者每周周几,这样场景;of()方法就捉襟见肘了。 不要着急,LocalDateTime还提供了一个 with() 方法,能够方便达到以上目的。 先看举例: ...
  • 获取当前日期、获取当前时间获取指定格式日期时间、时间戳 代码如下,复制粘贴改名即可使用, package com.llw.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java....
  • golang提供了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...
  • 因为提交给测试测试太多 出问题的包可能会混 所以加了个打包时间 和其他一些app 和手机信息 方便测试在提BUG时候带上1. 在 Xcode 工程对应 Target build Phases 中新增 run Scrpit Phase2 创建 build...
  • 获取系统当前毫秒值转化为时间,将字符串转化为时间获取系统当前毫秒值转化为时间字符串将字符串格式化为想要日期格式,将utilDate转化为SqlDate 获取系统当前毫秒值转化为时间字符串 //计算机底层...
  • * @description: 获取两个日期之间所有日期(参数及返回日期均为字符串格式) * @param startTime 开始日期 * @param endTime 结束日期 * @return List&lt;String&gt; 日期集合 * @throws Parse...
  • 为什么80%码农都做不了架构师?>>> ...
  • &lt;?.../** * Created by PhpStorm. * User: Administrator * Date: 2018/2/26 * Time: 22:08 ...//利用setTime()设置时间 $d = new DateTime(); $d -&gt;setDate(2016,2,3); $d-&gt;setTime(10...
  • 计划是统计 上次触发 到 现在 这个时间段之间的某些信息,我本以为使用cron的Prev就能很好的实现,但是测试时发现Prev的时间几乎就是本次执行的时间。 代码是这样的: func main() { cronSpec:= "0 */1 * * * ?" ...
  • 由于我们拥有较多服务器,因而如何尽快地知道服务器上某项服务是否挂了就是一个运维人员需要解决问题。基本想法就是开发一个监控服务,我将其取名ServerDog,设置Service模块,其会按照设定频率与各种服务...
  • java获取java文件路径四种方法发布时间:2020-04-17 11:03:45来源:亿速云阅读:750作者:小新今天小编给大家分享是java获取java文件路径四种方法,很多人都不太了解,今天小编为了让大家更加了解获取java文件...
  • Android 下获取各个包的信息...自己在写东西的时候需要获取到手机上所有包的安装时间、使用次数、使用时长、最后一次启动的时间等等信息。 百度谷歌良久,终于完成。 android里是有获取这些数据所需要的包的,分别是: ...
  • 1. 需求:获取两个时间段之间每一天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获取系统当前的时间的方法:可以利用datetime.datetime.now()函数来获取。具体方法:1、导入datetime...具体方法:1、导入import datetime2、获取当前的时间curr_time = datetime.datetime.now() # 2019-07...
  • 简介:一种使用349体积相机获取体积测量开始时间点和结束测量时间点以及包裹四个顶角位置信息可行办法。 本文档适用问题 体积相机型号为:MV-DL2040-04B-H、MV-DL2025-04D-H、MV-DL2025-04H-H 项目中存在...
  • 前段时间后端的同学比较有空,所以他先做了渠道包的方案。 V1的签名,在META-INF目录下添加空文件(考虑到游戏也可能会在ZIP Comment) V2的签名,就参考美团的方案(增加一个自定义的key,不会和游戏的方案冲突)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,102
精华内容 2,840
关键字:

获取包的时间