首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux套接字时间戳选项

Linux套接字时间戳选项
EN

Stack Overflow用户
提问于 2017-05-26 11:52:16
回答 1查看 2.4K关注 0票数 4

引用此在线内核文档的形式

  • SO_TIMESTAMPING在接收、传输或两者都生成时间戳。支持多个时间戳源,包括硬件。支持为套接字生成时间戳。

Linux支持TCP时间戳,我试图编写一些演示代码来获得TCP数据包的任何时间戳。

服务器代码如下:

代码语言:javascript
复制
//Bind
if( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
{
    perror("bind failed. Error");
    return 1;
}
puts("bind done");

//Listen
listen(socket_desc , 3);

//Accept and incoming connection
puts("Waiting for incoming connections...");
int c = sizeof(struct sockaddr_in);

client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c);
if (client_sock < 0)
{
    perror("accept failed");
    return 1;
}

// Note: I am trying to get software timestamp only here..
int oval = SOF_TIMESTAMPING_RX_SOFTWARE | SOF_TIMESTAMPING_SOFTWARE;
int olen = sizeof( oval );
if ( setsockopt( client_sock, SOL_SOCKET, SO_TIMESTAMPING, &oval, olen ) < 0 )
    { perror( "setsockopt TIMESTAMP"); exit(1); }

puts("Connection accepted");

char    buf[] = "----------------------------------------";
int len = strlen( buf );

struct iovec    myiov[1] = { {buf, len } };

unsigned char   cbuf[ 40 ] = { 0 };
int     clen = sizeof( cbuf ); 

struct msghdr   mymsghdr = { 0 };
mymsghdr.msg_name   = NULL;
mymsghdr.msg_namelen    = 0;
mymsghdr.msg_iov    = myiov;
mymsghdr.msg_iovlen = 1;
mymsghdr.msg_control    = cbuf;
mymsghdr.msg_controllen = clen;
mymsghdr.msg_flags  = 0;

int read_size = recvmsg( client_sock, &mymsghdr, 0);

if(read_size == 0)
{
  puts("Client disconnected");
  fflush(stdout);
}
else if(read_size == -1)
{
  perror("recv failed");
}
else
{
  struct msghdr *msgp = &mymsghdr;
  printf("msg received: %s \n",(char*)msgp->msg_iov[0].iov_base);// This line is successfully hit.
  // Additional info: print msgp->msg_controllen inside gdb is 0.
  struct cmsghdr    *cmsg;
  for ( cmsg = CMSG_FIRSTHDR( msgp );
      cmsg != NULL;
      cmsg = CMSG_NXTHDR( msgp, cmsg ) )
  {
    printf("Time GOT!\n"); // <-- This line is not hit.
    if (( cmsg->cmsg_level == SOL_SOCKET )
        &&( cmsg->cmsg_type == SO_TIMESTAMPING ))
      printf("TIME GOT2\n");// <-- of course , this line is not hit
  } 

}

你知道为什么这里没有时间戳吗?谢谢

解决方案,我能够获得软件时间戳和硬件时间戳使用负载与太阳光NIC。仍然不知道如何单独获得软件时间戳。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-02 19:20:03

你给出的链接,在最后的评论中说:

代码语言:javascript
复制
I've discovered why it doesn't work. SIOCGSTAMP only works for UDP
packets or RAW sockets, but does not work for TCP. – Gio Mar 17 '16 at 9:331    

it doesn't make sense to ask for timestamps for TCP, because there's
no direct correlation between arriving packets and data becoming 
available. If you really want timestamps for TCP you'll have to use 
RAW sockets and implement your own TCP stack (or use a userspace TCP
library). – ecatmur Jul 4 '16 at 10:39 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44200946

复制
相关文章

相似问题

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