Почему простая программа не запускается сразу - PullRequest
0 голосов
/ 02 октября 2018

Пожалуйста, поймите, что я не могу спросить конкретно, потому что я не знаю ключевых слов, связанных с этой проблемой.

Проблема в том, что, если запустить программу из следующего источника, программа не запустится сразу.

#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 голосов
/ 02 октября 2018

Если запустить программу с использованием ssh в среде Nat, «захвачено!»на выходе происходит фактический передаваемый пакет.Проблема не в блокировке, а в отсутствии реального транспортного пакета.спасибо за внимание.

0 голосов
/ 02 октября 2018

Я думаю, что ваша проблема в том, что вы устанавливаете отрицательное значение для to_ms , то есть время ожидания буфера, в вашем вызове

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

Как указано в здесь , 4-й параметр в pcap_open_live ()

указывает время ожидания буфера пакета в качестве неотрицательного значения в миллисекундах

Если вы читаете главную страницу pcap , в ней говорится, что

тайм-аут буфера пакетов :

Еслипри захвате пакеты доставляются сразу после их поступления, приложение, которое захватывает пакеты, будет активировано для каждого пакета по мере его поступления, и может потребоваться сделать один или несколько вызовов операционной системы для извлечения каждого пакета.Если вместо этого пакеты не доставляются сразу после их поступления, а доставляются после небольшой задержки (называемой «тайм-аутом буфера пакетов»), перед доставкой пакетов может быть накоплено более одного пакета, так что один пробуждение приведет кдолжно быть сделано для нескольких пакетов, и каждый набор обращений к операционной системе будет предоставлять несколько пакетов, а не один пакет.Это уменьшает нагрузку на ЦП для каждого пакета, если пакеты поступают с высокой скоростью, увеличивая количество пакетов в секунду, которые могут быть перехвачены.Тайм-аут буфера пакетов необходим, чтобы приложение не дожидалось заполнения буфера захвата операционной системы до доставки пакетов;если пакеты приходят медленно, это ожидание может занять произвольно длительный период времени.

В конце этого параграфа говорится, что:

Недопустимое отрицательное значение;результат установки отрицательного значения тайм-аута непредсказуем.

Поэтому я предлагаю вам попытаться установить это значение равным 0 или положительным значениям, чтобы увидеть, соответствует ли поведение ожидаемому.

...