【问题标题】:PCap library issue with receive接收的 PCap 库问题
【发布时间】:2011-06-15 07:02:10
【问题描述】:

所以我一直遇到 PCap 库的接收功能问题。

我设置了一个回显服务器(在我的 PC 之外),它只接收一个数据包并将其转过来。因此,在我的应用程序中,我发送了一个数据包(工作正常)并尝试使用 pcap_next() 接收响应数据包(来自回显服务器)。由于某种原因,它会等待整整 1 秒才能使用 pcap_next() 接收数据包,即使 Wireshark 显示数据包在不到 1 毫秒的时间内被翻转。因此,当我发送 1000 个数据包时,接收所有响应需要 1000 秒。

我不知道为什么会这样,所以我尝试切换到 pcap_loop()。显然现在它正在做一些更奇怪的事情。我发送 1000 个数据包,接收 1000 个数据包,但不是按照我期望的顺序。

我希望这样(这是我在 Wireshark 上看到的):

Send packet #1
Receive packet #1
Send packet #2
Receive packet #2
etc.

但这是我真正得到的:

Send packet #1
Send packet #2
etc.
Wait 1 second
Receive packet #1
Receive packet #2
etc.

这是怎么回事?

【问题讨论】:

  • 你试过setsockopt w/TCP_NODELAY吗? (随机扔出去......我最近才读到这个,想知道它是否相关:en.wikipedia.org/wiki/Nagle%27s_algorithm
  • 不适用。我正在发送原始 UDP 数据包。

标签: c++ pcap winpcap


【解决方案1】:

也许你想轮询,而不是拉。只需致电pcap_dispatchpcap_loop,它会尽快给您回电并发送数据包。 pcap_next 效率不高,因为它启动一个调度循环并在收到第一个数据包后停止它。阅读更多http://www.tcpdump.org/pcap.html

【讨论】:

    【解决方案2】:

    想出了解决办法。我需要将 TX 和 RX 放在两个单独的线程上。

    RX 线程永远这样做:

    pcap_loop(handle, -1, got_packet, NULL);
    

    然后我会随时调用 TX 线程,它会执行此操作(并且循环多次我需要):

    pcap_sendpacket(t, TxPacket, DataLen + 42);
    

    这解决了问题。

    【讨论】:

      猜你喜欢
      • 2011-05-16
      • 1970-01-01
      • 2011-06-01
      • 2011-09-09
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多