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

标签 c linux sockets tcpdump

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

sudo tcpdump -n 源端口 1050 sudo tcpdump -i em1 "端口 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
}

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

谢谢。

最佳答案

您需要使用 INADDR_BROADCAST 而不是 INADDR_ANY。

关于c - 无法使用 tcpdump 捕获 IP 广播数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21505144/

相关文章:

python - 单击终端中的元素

linux - 禁用 docker 中现有容器的日志

c - 绑定(bind)失败 : Cannot assign requested address

c# - 关闭客户端应用程序: existing connection was forcibly closed by the remote host时在服务器上记录ServiceModel错误

sockets - Python 套接字多个客户端

c - 虽然循环不退出但条件为真

c - 错误 : "invalid use of incomplete type ‘RSA {aka struct rsa_st}" in OpenSSL 1. 1.0

linux - 如何使用 .Xdefaults 文件更改 xterm 颜色?

c - 有 n 个节点的 AVL 树的最大可能高度是多少

c - 试图理解这段c代码但就是无法理解