首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python网络时间戳(SO_TIMESTAMP,SO_TIMESTAMPNS,SO_TIMESTAMPING)

Python网络时间戳(SO_TIMESTAMP,SO_TIMESTAMPNS,SO_TIMESTAMPING)
EN

Stack Overflow用户
提问于 2017-09-19 13:52:23
回答 2查看 3.6K关注 0票数 4

Linux提供了几种获取接收数据包(SO_TIMESTAMP、SO_TIMESTAMPNS、SO_TIMESTAMPING)或发送(SO_TIMESTAMPING)数据包的时间戳的方法。

内核文件:https://www.kernel.org/doc/Documentation/networking/timestamping.txt

有什么方法可以和Python一起使用吗?我在Python源代码中没有看到任何SO_TIMESTAMP常量。尝试3.6.2和GitHub主分支。

现在,我只能使用SIOCGSTAMP,它为我提供了上一个接收到的数据包的时间戳,而且似乎没有任何东西可以用于发送数据包时间戳。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-20 19:33:26

最后,我得到了这样的SO_TIMESTAMPNS值:

代码语言:javascript
复制
SO_TIMESTAMPNS = 35
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(3))
s.setsockopt(socket.SOL_SOCKET, SO_TIMESTAMPNS, 1)
raw_data, ancdata, flags, address = s.recvmsg(65535, 1024)

ancdata是硬件时间戳,作为timespec(ulong,ulong)。

在Linux上工作,但在Mac上不工作。

票数 5
EN

Stack Overflow用户

发布于 2019-01-11 13:45:28

完成代码,使用python3发送和接收

代码语言:javascript
复制
import struct
import time
import select
import socket
import sys
if(len(sys.argv)!=2):
    print("usage: ",sys.argv[0]," <send|receive>")
    sys.exit()
print(sys.argv[1]);
if(sys.argv[1]=='send'):
    MESSAGE = "Hello, World!"
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
    s.connect(('localhost', 10000))
    s.send(MESSAGE)
    time.sleep(0.0001)
    #time.sleep(5)
    s.send(MESSAGE)
    s.close()
else:
    SO_TIMESTAMPNS = 35
    #s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(3))

    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setblocking(0)

    server.setsockopt(socket.SOL_SOCKET, SO_TIMESTAMPNS, 1)
    server.bind(('localhost', 10000))
    server.listen(5)
    inputs = [ server ]
    message_queues = {}
    outputs = []
    while inputs:
        print('\nwaiting for the next event')
        readable, writable, exceptional = select.select(inputs, outputs, inputs)
        for s in readable:
            if s is server:
                connection, client_address = s.accept()
                print('new connection from', client_address)
                connection.setblocking(0)
                inputs.append(connection)                
            else:
                raw_data, ancdata, flags, address = s.recvmsg(65535, 1024)
                print('received ', raw_data, '-',ancdata,'-',flags,'-',address)
                if(len(ancdata)>0):
                    #print(len(ancdata),len(ancdata[0]),ancdata[0][0],ancdata[0][1],ancdata[0][2])
                    #print('ancdata[0][2]:',type(ancdata[0][2])," - ",ancdata[0][2], " - ",len(ancdata[0][2]));
                    for i in ancdata:
                        print('ancdata: (cmsg_level, cmsg_type, cmsg_data)=(',i[0],",",i[1],", (",len(i[2]),") ",i[2],")");
                        if(i[0]!=socket.SOL_SOCKET or i[1]!=SO_TIMESTAMPNS):
                            continue
                        tmp=(struct.unpack("iiii",i[2]))
                        timestamp = tmp[0] + tmp[2]*1e-10
                        print("SCM_TIMESTAMPNS,", tmp, ", timestamp=",timestamp)
                if(not raw_data):
                    print('closing after reading no data')
                    # Stop listening for input on the connection
                    if s in outputs:
                        outputs.remove(s)
                    inputs.remove(s)
                    s.close()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46302308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档