请理解,由于我不知道与该问题相关的关键字,因此我无法明确询问。
问题在于,如果在以下源代码中运行该程序,该程序将不会立即运行。
#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;
}
程序在以下两个条件下执行。
为什么会这样,该程序如何立即运行?
答案 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运行程序,则“被捕获!”输出发生实际发送的数据包。问题不是阻塞,而是没有实际的传输数据包。谢谢您的关注。