无法使用tcpdump捕获IP广播数据包

时间:2014-02-01 23:39:51

标签: c linux sockets tcpdump

我正在使用示例udp客户端程序发送IP广播数据包,并尝试使用tcpdump捕获相同内容并使用以下示例命令

sudo tcpdump -n src port 1050 sudo tcpdump -i em1“port 1050”

这是ip route的输出(带有修改的IP地址)

default via x.x.x.x dev em1  proto static
x.46.78.0/23 dev em1  proto kernel  scope link  src x.y.79.16  metric 1
x.y.0.0/16 dev p4p1.1102  proto kernel  scope link  src x.y.7.45  metric 6
x.y.0.0/16 dev p4p1.1103  proto kernel  scope link  src x.y.7.45  metric 6
x.y.0.0/24 dev p4p1.1100  proto kernel  scope link  src x.y.0.1  metric 6
x.y.1.0/24 dev prvn-bridge  proto kernel  scope link  src x.y.1.10  metric 20
x.y.122.0/24 dev virbr0  proto kernel  scope link  src x.y.122.1
x.0.0.0/4 dev p4p1.1102  proto static
x.0.0.0/4 dev p4p1.1103  proto static

//Client code used for sending IP Broadcast packet (modified version of http://www.csee.usf.edu/~christen/tools/udpClient.c)

#define  BSD                // WIN for Winsock and BSD for BSD sockets

//----- Include files ---------------------------------------------------------
#include <stdio.h>          // Needed for printf()
#include <string.h>         // Needed for memcpy() and strcpy()
#ifdef WIN
  #include <windows.h>      // Needed for all Winsock stuff
#endif
#ifdef BSD
  #include <sys/types.h>    // Needed for sockets stuff
  #include <netinet/in.h>   // Needed for sockets stuff
  #include <sys/socket.h>   // Needed for sockets stuff
  #include <arpa/inet.h>    // Needed for sockets stuff
  #include <fcntl.h>        // Needed for sockets stuff
  #include <netdb.h>        // Needed for sockets stuff
#endif

//----- Defines ---------------------------------------------------------------
#define  PORT_NUM           1050  // Port number used

//===== Main program ==========================================================
void main(void)
{
#ifdef WIN
  WORD wVersionRequested = MAKEWORD(1,1);       // Stuff for WSA functions
  WSADATA wsaData;                              // Stuff for WSA functions
#endif
  int                  client_s;        // Client socket descriptor
  struct sockaddr_in   server_addr;     // Server Internet address
  int                  addr_len;        // Internet address length
  char                 out_buf[4096];   // Output buffer for data
  char                 in_buf[4096];    // Input buffer for data
  int                  retcode;         // Return code
  int                  iOptVal;         // Socket option value
  int                  iOptLen;         // Socket option length
  int                  count;

#ifdef WIN
  // This stuff initializes winsock
  WSAStartup(wVersionRequested, &wsaData);
#endif

  // Create a socket
  client_s = socket(AF_INET, SOCK_DGRAM, 0);
  if (client_s < 0)
  {
    printf("*** ERROR - socket() failed \n");
    exit(-1);
  }

  // Fill-in server socket's address information
  server_addr.sin_family = AF_INET;                 // Address family to use
  server_addr.sin_port = htons(PORT_NUM);           // Port num to use
  server_addr.sin_addr.s_addr = (INADDR_ANY); // Need this for Broadcast

  // Set socket to use MAC-level broadcast
  iOptVal = 1;
  iOptLen = sizeof(int);
  setsockopt(client_s, SOL_SOCKET, SO_BROADCAST, (char*)&iOptVal, iOptLen);

  // Assign a message to buffer out_buf
  strcpy(out_buf, "Test message from CLIENT to SERVER");

  // Now send the message to server.
  for (count = 0 ; count < 100; count++)
  {
  printf("Sending a broadcast packet\n");
  retcode = sendto(client_s, out_buf, (strlen(out_buf) + 1), 0,
    (struct sockaddr *)&server_addr, sizeof(server_addr));
  if (retcode < 0)
  {
    printf("*** ERROR - sendto() failed \n");
    exit(-1);
  }
  sleep(5);
  }

#if 0
  // Wait to receive a message
  addr_len = sizeof(server_addr);
  retcode = recvfrom(client_s, in_buf, sizeof(in_buf), 0,
    (struct sockaddr *)&server_addr, &addr_len);
  if (retcode < 0)
  {
    printf("*** ERROR - recvfrom() failed \n");
    exit(-1);
  }
#endif
  // Output the received message
  printf("Received from server: %s \n", in_buf);

  // Close all open sockets
#ifdef WIN
  retcode = closesocket(client_s);
  if (retcode < 0)
  {
    printf("*** ERROR - closesocket() failed \n");
    exit(-1);
  }
#endif
#ifdef BSD
  retcode = close(client_s);
  if (retcode < 0)
  {
    printf("*** ERROR - close() failed \n");
    exit(-1);
  }
#endif

#ifdef WIN
  // This stuff cleans-up winsock
  WSACleanup();
#endif
}

但由于某种原因,我看不到数据包。有人可以帮我解决这个问题。

感谢。

1 个答案:

答案 0 :(得分:0)

您需要使用INADDR_BROADCAST而不是INADDR_ANY。