c - 网络接收定时器以 ms 分辨率

标签 c sockets network-programming timer

我的场景是,我正在收集网络数据包,如果数据包与网络过滤器匹配,我想记录连续数据包之间的时间差,最后一部分是不起作用的部分。我的问题是,无论我使用什么 C 定时器函数,我都无法获得准确的亚秒级测量。我尝试过:gettimeofday()、clock_gettime() 和clock()。

我正在寻求帮助来找出我的计时代码无法正常工作的原因。

我正在 cygwin 环境中运行。 编译选项:gcc -Wall capture.c -o capture -lwpcap -lrt

代码片段:

/*globals*/
int first_time = 0;
struct timespec start, end;
double sec_diff = 0;

main() {
  pcap_t *adhandle;
  const struct pcap_pkthdr header;
  const u_char *packet;
  int sockfd = socket(PF_INET, SOCK_STREAM, 0);

      .... (previous I create socket/connect - works fine)

  save_attr = tty_set_raw();

  while (1) {  

    packet = pcap_next(adhandle, &header);     // Receive a packet? Process it
    if (packet != NULL) {
      got_packet(&header, packet, adhandle);
    }

    if (linux_kbhit()) {         // User types message to channel
      kb_char = linux_getch();       // Get user-supplied character
      if (kb_char == 0x03)         // Stop loop (exit channel) if user hits Ctrl+C
        break;
    }
  } 
  tty_restore(save_attr);
  close(sockfd);
  pcap_close(adhandle);
  printf("\nCapture complete.\n");
}

在got_packet中:

got_packet(const struct pcap_pkthdr *header, const u_char *packet, pcap_t * p){    ... {

   ....do some packet filtering to only handle my packets, set match = 1
  if (match == 1) {
    if (first_time == 0) {
      clock_gettime( CLOCK_MONOTONIC, &start );
      first_time++;
    }
    else {
      clock_gettime( CLOCK_MONOTONIC, &end );

      sec_diff = (end.tv_sec - start.tv_sec) + ((end.tv_nsec - start.tv_nsec)/1000000000.0);  // Packet difference in seconds

      printf("sec_diff: %ld,\tstart_nsec: %ld,\tend_nsec: %ld\n", (end.tv_sec - start.tv_sec), start.tv_nsec, end.tv_nsec);
      printf("sec_diffcalc: %ld,\tstart_sec: %ld,\tend_sec: %ld\n", sec_diff, start.tv_sec, end.tv_sec);
      start = end;         // Set the current to the start for next match
    }
  }
}

我用 Wireshark 记录所有数据包进行比较,因此我希望计时器的差异与 Wireshark 的相同,但事实并非如此。我的 tv_sec 输出将是正确的,但 tv_nsec 甚至不接近。假设wireshark中有0.5秒的差异,我的计时器会说有1.999989728秒的差异。

最佳答案

基本上,您需要使用 higher resolution 的计时器。

此外,我没有检查 libpcap,但我很确定 libpcap 可以为您提供收到每个数据包的时间。在这种情况下,您将能够最接近 Wireshark 显示的内容。

关于c - 网络接收定时器以 ms 分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3936654/

相关文章:

Java socketChannel 检测无序关闭连接

synchronization - 简单的在线乒乓游戏网络同步

c++ - 在 C/C++ 中实现跨平台、多线程服务器的最佳方法是什么?

黑莓消耗wcf

c - 一起使用 getchar() 和 malloc()

c++ - 如何在不使用归约的情况下避免竞争条件

java.net.BindException : EADDRINUSE (Address already in use)

java - 向套接字发送数据时的 ObjectOutputStream 问题

c - 在二维数组中查找数字的位置

c - 内存空闲抛出 segFault