如果没有Wireshark运行,无法在C中嗅探UDP数据包

时间:2015-05-05 10:43:00

标签: c linux sockets udp wireshark

我的设置如下:

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

所以我有一个目标连接到交换机,它发送UDP数据包用于调试目的。通常这些数据包会进入Windows计算机进行分析,这是可行的。我现在也添加了一台Linux计算机,为Linux和Windows提供相同的数据我设置了一个管理交换机来镜像流量,这在我查看Wireshark时工作正常。然后我编写了一个简单的C-application来分析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-application中没有从目标接收任何数据?

2 个答案:

答案 0 :(得分:3)

here相同,您需要将接口(不是我最初发布的套接字)放入混杂模式。 Wireshark这样做,这就是为什么你的代码在Wireshark运行时有效。

答案 1 :(得分:0)

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