发送广播消息时的奇怪行为

Strange behaviour while sending broadcast message

我有两个程序:客户端和服务器。他们正在尝试使用广播在本地网络中找到自己。

客户端使用 SERVER_PORT(之前已知)在广播中发送简单数据包,服务器打印有关连接的信息,但是当我尝试此解决方案时,我发现了一些奇怪的行为,当我取消注释 [=15] 的最后两行时=] 服务器打印(一个自定义结构)

Connection from: 0.0.0.0 on port: 0

评论这些行后一切正常,我是否遗漏了什么?

server.c

  int broadcast_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  struct sockaddr_in broadcast_addr;
  broadcast_addr.sin_addr.s_addr = INADDR_ANY;
  broadcast_addr.sin_port = htons(SERVER_PORT);
  broadcast_addr.sin_family = AF_INET;

  if (bind(broadcast_socket, (struct sockaddr *)&broadcast_addr,
           sizeof(broadcast_addr))) {
    perror("bind");
  }

  struct sockaddr_in recv_addr;
  char buf[MAX_PACKET_SIZE];
  socklen_t len;

  if (recvfrom(broadcast_socket, buf, MAX_PACKET_SIZE, 0,
               (struct sockaddr *)&recv_addr, &len) < 0) {
    perror("recvfrom");
  }

  printf("Connection from: %s on port: %d\nMessage: %s\n",
         inet_ntoa(recv_addr.sin_addr), ntohs(recv_addr.sin_port), buf);

  /* struct network_packet packet; */

  /* struct sockaddr_in my_addr; */

client.c

int find_server(struct sockaddr_in *out) {
  struct sockaddr_in broadcast;
  struct network_packet packet;
  int yes = 1;
  socklen_t len;

  broadcast.sin_addr.s_addr = INADDR_ANY;
  broadcast.sin_port = htons(CLIENT_PORT);
  broadcast.sin_family = AF_INET;


  int socket_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

  if (bind(socket_fd, (struct sockaddr *)&broadcast, sizeof(broadcast))) {
    perror("bind");
  }

  if (get_broadcast_addr(&broadcast.sin_addr)) {
    return -1;
  }

  printf("Target address: %s\n", inet_ntoa(broadcast.sin_addr));

  broadcast.sin_port = htons(SERVER_PORT);
  broadcast.sin_family = AF_INET;

  setsockopt(socket_fd, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes));

  char buf[10] = "test";

  sendto(socket_fd, buf, strlen(buf), 0, (struct sockaddr *)&broadcast,
         sizeof(broadcast));

  if (recvfrom(socket_fd, &packet, sizeof(packet), 0,
               (struct sockaddr *)&broadcast, &len) < 0) {
    perror("recvfrom");
  }

  struct sockaddr_in *sa = (struct sockaddr_in *)packet.data;

  memcpy(out, sa, packet.header.packet_length);

  return 0;
}
struct network_packet_header {
  enum network_packet_type type;
  int packet_length;
};

struct network_packet {
  struct network_packet_header header;
  unsigned char data[MAX_DATA_LENGTH];
};

您必须将作为 recvfromaddrlen 传递的变量初始化为地址结构的大小。