小编Vik*_*ram的帖子

接收具有微秒级精度的RAW套接字数据包

我正在编写一个代码,它从服务器每隔1ms接收一次原始以太网数据包(无TCP/UDP).对于收到的每个数据包,我的应用程序必须回复14个原始数据包.如果服务器在每1ms发送一次数据包之前没有收到14个数据包,则服务器会发出警报并且应用程序必须中断.服务器 - 客户端通信是一对一链接.

服务器是硬件(FPGA),以精确的1ms间隔生成数据包.客户端应用程序在具有10G SolarFlare NIC的Linux(RHEL/Centos 7)计算机上运行.

我的第一个代码版本是这样的

while(1)
{
  while(1)
  {
     numbytes = recvfrom(sockfd, buf, sizeof(buf), 0, NULL, NULL);
     if(numbytes > 0)
     {
        //Some more lines here, to read packet number
        break;
     }
  }
  for (i=0;i<14;i++)
  {
     if (sendto(sockfd,(void *)(sym) , sizeof(sym), 0, NULL, NULL) < 0)
            perror("Send failed\n");
  }
}
Run Code Online (Sandbox Code Playgroud)

我通过clock_gettimerecvfrom呼叫之前采用时间戳(使用)和在呼叫之后采用时间戳来测量接收时间,我打印这些时间戳的时间差并在时间差超过900-1100 us的允许范围时打印它们.

我面临的问题是数据包接收时间是波动的.这样的事情(打印是以微秒为单位)

Decode Time : 1234
Decode Time : 762
Decode Time : 1593
Decode Time : 406
Decode Time : 1703
Decode …
Run Code Online (Sandbox Code Playgroud)

c sockets linux performance networking

11
推荐指数
1
解决办法
887
查看次数

标签 统计

c ×1

linux ×1

networking ×1

performance ×1

sockets ×1