【问题标题】:Cannot sniff UDP packets in C without Wireshark running在没有运行 Wireshark 的情况下无法在 C 中嗅探 UDP 数据包
【发布时间】:2015-05-05 18:49:22
【问题描述】:

我的设置如下所示:

Target ---- Switch ---- Switch ---- Windows computer
                           |
                     Linux computer

所以我有一个连接到交换机的目标,它发送 UDP 数据包以进行调试。通常,这些数据包会发送到 Windows 计算机进行分析,这是可行的。我现在还添加了一台 Linux 计算机,为了在 Linux 和 Windows 上获取相同的数据,我设置了一个托管交换机来镜像流量,当我在 Wireshark 中查看时,这工作正常。然后我编写了一个简单的 C 应用程序来分析 Linux 计算机上的数据,该软件只有在 Wireshark 同时运行时才能工作。否则它不会从目标接收任何数据。为什么是这样?

int main()
{
   int saddr_size, data_size;
   struct sockaddr saddr;

   unsigned char *buffer = (unsigned char *) malloc(BUFFER_SIZE);

   printf("Starting...\n");

   int sock_raw = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

   if (sock_raw < 0)
   {
      printf("Socket Error");
      return 1;
   }

   while (1)
   {
      saddr_size = sizeof saddr;
      data_size = recvfrom(sock_raw, buffer, BUFFER_SIZE, 0, &saddr, (socklen_t*) &saddr_size);
      if (data_size < 0)
      {
         printf("Recvfrom error , failed to get packets\n");
         return 1;
      }
      processPacket(buffer);
   }
   close(sock_raw);
   printf("Finished");
   return 0;
}

来自目标的数据以类似于 RTP 的格式发送并发送到 Windows 计算机。

总结一下;为什么在没有运行 Wireshark 的情况下,我的 C 应用程序中收不到来自目标的任何数据?

【问题讨论】:

    标签: c linux sockets udp wireshark


    【解决方案1】:

    here 相同,您需要将接口(不是我最初发布的套接字)置于混杂模式。 Wireshark 就是这样做的,这就是为什么您的代码在 Wireshark 运行时可以正常工作的原因。

    【讨论】:

    • 谢谢,启用混杂模式有帮助。
    【解决方案2】:

    只是猜测:混杂模式未打开,以太网控制器正在丢弃未发送给它的帧。

    【讨论】:

    • 谢谢,启用混杂模式有帮助。
    猜你喜欢
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2017-11-24
    • 2017-06-25
    • 2013-05-02
    • 2020-12-12
    相关资源
    最近更新 更多