读书人

关于时间戳想得到绝无仅有的时间戳

发布时间: 2012-07-30 16:19:05 作者: rapoo

关于时间戳,想得到独一无二的时间戳
我现在通过SOCKET进行通信,消息结构体中有个字段名为time_t time;通过time.h头文件中的 time方法给值,但是我突然在CONSOLE下
进行如下测试:
time_t t1,t2;
time(&t1);
time(&t2);
发现获得的t1和t2的值一样,也就是说当我连续发送消息的时候,可能产生的时间戳是一样的,而我 本希望时间戳作为一个独一无二的标志,来区分我发的哪条消息。
愿望成空了,如果 哪位 大哥大姐 大叔大婶 有更好的方法,请告知:
感谢涕零。

[解决办法]
使用gettimeofday吧,到微秒级的
不过时间戳非时间,理论上总会有可能会重
[解决办法]
呵呵你同时进行两次时间戳的读取怎么行呢?
time返回的是秒,一秒中进行1000w次的time都可以
因此你得到两个一样的time是正常的,你两次中间可以休息一下如下:

C/C++ code
#include <stdio.h> #include <time.h>#include "windows.h"int main(int argc,char *argv[]) {     time_t time1 = time(NULL);    printf("%d\n", time1);    Sleep(5000); //休息5秒    time1 = time(NULL);    printf("%d\n", time1);}
[解决办法]
不要用时间,用个统一id,每发一个包就加1
tcp即如此
[解决办法]
windows平台,试试用QueryPerformanceCounter,系统的ticks应该是不停变化的
[解决办法]
探讨
终于明白原来TIME取的是秒级别的,各位有读取微秒级别的函数吗?据说gettimeofday可以 我去看下。
建立一个整型加1的方法,这个方法是我们最后考虑使用的方法,老大说看能不能找到读出微秒的方法,不过我现在觉得微秒也不够啊,现在执行一条语令估计到纳秒及别了吧,连续发送两个消息,估计用微秒也区分不出了

[解决办法]
用秒时间加秒内包计数就可以了,不要依赖系统时间,因为有任务调度延迟。另外,时间秒unix原来的定义是从1970年1月1日0时开始的总秒数,一个unsigned long型

[解决办法]
WinPcap的驱动就是用QueryPerformanceFrequency和QueryPerformanceCounter(当然是内好模式对应的API:KeQueryPerformanceCounter)来给每个packet打时间戳的。
至于Linux上如何实现,LZ可以参考一下lipcap的实现
[解决办法]
用自己的id变量比较好
[解决办法]
Sleep()的时间精度是大于30毫秒的
也就是说设置的低了未必能达到30以下的值
你所谓的t1 t2的值一样,我估计你是这么做的吧
for(int i = 0 ;i<200;i++)
{
int t1,t2;
t1=GetTickCount();
Sleep(1);
t2=GetTickCount();
//Sleep(1);
//if(t1 == t2)
TRACE("t1 = %d t2 = %d\n",t1,t2);
}

你把第二个sleep 加上就不会有t1,t2相同了
[解决办法]
探讨
不要用时间,用个统一id,每发一个包就加1
tcp即如此

读书人网 >C语言

热点推荐