为什么简单的程序无法立即启动

时间:2018-10-02 01:27:45

标签: c++ linux pthreads flush

请理解,由于我不知道与该问题相关的关键字,因此我无法明确询问。

问题在于,如果在以下源代码中运行该程序,该程序将不会立即运行。

#include <iostream>

#include <pcap/pcap.h>

int main() {
  bool stop = false;
  pcap_t *pcp = nullptr;
  pcap_pkthdr *pkthdr = nullptr;
  const u_char *packet = nullptr;
  char errbuf[PCAP_ERRBUF_SIZE];
  int res = 0;

  //It works normally. "here" printed.
  std::cout << "here"
  //----------- I think pcap_open_live() block the program --------------
  pcp = pcap_open_live("enp0s3", BUFSIZ, 0, -1, errbuf);
  //if run following, the program print "captured!" phrase.
  //std::cout << "any string\n";
  if (pcp == nullptr) {
    return 0;
  }
  //if run following, the program print "captured!" phrase.
  //std::cout << "any string\n";
  while (!stop) {
    while (res == 0) {
      res = pcap_next_ex(pcp, &pkthdr, &packet);
    }
    if (res < 0) {
      stop = true;
    } else {
      std::cout << "captured!\n";
    }
  }

  return 0;
}

程序在以下两个条件下执行。

  • 输入任何键
  • 像评论一样打印标准输出

为什么会这样,该程序如何立即运行?

2 个答案:

答案 0 :(得分:0)

我认为您的问题是您在调用

时为 to_ms 设置了负值,即缓冲区超时

pcap_open_live(const char *device, int snaplen, int promisc, int to_ms, char *errbuf)

here中所述,pcap_open_live()中的第4个参数

  

将数据包缓冲区超时指定为非负值   毫秒

如果您阅读主要的pcap page,它会指出

  

数据包缓冲区超时

     

如果在捕获时将数据包作为   一旦它们到达,捕获数据包的应用程序将   每个数据包到达时都醒来,可能需要制作一个或   对操作系统的更多调用以获取每个数据包。如果相反   数据包不会在到达后立即传送,而是会传送   短暂延迟(称为“数据包缓冲区超时”)后,超过一个   数据包可以在数据包交付之前被累积,因此   单个唤醒将针对多个数据包完成,并且每组   对操作系统的调用将提供多个数据包,   而不是单个数据包。这减少了每个数据包的CPU开销   如果数据包到达率很高,则增加   每秒可以捕获的数据包。数据包缓冲区超时为   以便应用程序不会等待操作系统的等待   捕获缓冲区以在发送数据包之前填满;如果数据包是   慢慢到达,那等待可能要花很长时间   时间。

本段末尾指出:

  

负值无效;将超时设置为a的结果   负值是不可预测的。

因此,我建议您尝试将其设置为0或正值,以查看行为是否符合预期。

答案 1 :(得分:0)

如果在Nat环境中使用ssh运行程序,则“被捕获!”输出发生实际发送的数据包。问题不是阻塞,而是没有实际的传输数据包。谢谢您的关注。

相关问题