Multicast not received by networked computers

偶尔善良 提交于 2019-12-25 04:17:31

问题


I'm trying to send a multicast to all network computers. I have my server set up on my computer and another computer on the network. When I send out the multicast message, the server running on my computer picks it up fine. The networked computer doesn't get anything though. I've tried setting the TTL to its max value and that hasn't done anything. I've also tried monitoring my packets using WireShark, but didn't see anything (I'm not very skilled with this). I'm confused why my computer receives it, but not the other networked computer. Here is the code I'm using to send the multicast:

#include <sys/types.h>   /* for type definitions */
#include <winsock2.h>    /* for win socket API calls */
#include <ws2tcpip.h>    /* for win socket structs */
#include <stdio.h>       /* for printf() */
#include <stdlib.h>      /* for atoi() */
#include <string.h>      /* for strlen() */

#define MAX_LEN  1024    /* maximum string size to send */
#define MIN_PORT 1024    /* minimum port allowed */
#define MAX_PORT 65535   /* maximum port allowed */

int main(int argc, char *argv[]) {

  int sock;                   /* socket descriptor */
  char send_str[MAX_LEN];     /* string to send */
  struct sockaddr_in mc_addr; /* socket address structure */
  int send_len;               /* length of string to send */
  char* mc_addr_str;          /* multicast IP address */
  unsigned short mc_port;     /* multicast port */
  unsigned char mc_ttl=255;     /* time to live (hop count) */
  WSADATA wsaData;            /* Windows socket DLL structure */

  /* validate number of arguments */
  if (argc != 3) {
    fprintf(stderr, 
            "Usage: %s <Multicast IP> <Multicast Port>\n", 
            argv[0]);
    exit(1);
  }

  mc_addr_str = argv[1];       /* arg 1: multicast IP address */
  mc_port     = atoi(argv[2]); /* arg 2: multicast port number */

  /* validate the port range */
  if ((mc_port < MIN_PORT) || (mc_port > MAX_PORT)) {
    fprintf(stderr, "Invalid port number argument %d.\n",
            mc_port);
    fprintf(stderr, "Valid range is between %d and %d.\n",
            MIN_PORT, MAX_PORT);
    exit(1);
  }

  /* Load Winsock 2.0 DLL */
  if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) {
    fprintf(stderr, "WSAStartup() failed");
    exit(1);
  }

  /* create a socket for sending to the multicast address */
  if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
    perror("socket() failed");
    exit(1);
  }

  /* set the TTL (time to live/hop count) for the send */
  if ((setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, 
       (void*) &mc_ttl, sizeof(mc_ttl))) < 0) {
    perror("setsockopt() failed");
    exit(1);
  } 

  /* construct a multicast address structure */
  memset(&mc_addr, 0, sizeof(mc_addr));
  mc_addr.sin_family      = AF_INET;
  mc_addr.sin_addr.s_addr = inet_addr(mc_addr_str);
  mc_addr.sin_port        = htons(mc_port);

  printf("Begin typing (return to send, ctrl-C to quit):\n");

  /* clear send buffer */
  memset(send_str, 0, sizeof(send_str));

  while (fgets(send_str, MAX_LEN, stdin)) {
    send_len = strlen(send_str);

    /* send string to multicast address */
    if ((sendto(sock, send_str, send_len, 0, 
         (struct sockaddr *) &mc_addr, 
         sizeof(mc_addr))) != send_len) {
      perror("sendto() sent incorrect number of bytes");
      exit(1);
    }

    /* clear send buffer */
    memset(send_str, 0, sizeof(send_str));
  }

  closesocket(sock);  
  WSACleanup();  /* Cleanup Winsock */

  exit(0);
}

回答1:


Please take a look at http://www.iana.org/assignments/multicast-addresses/multicast-addresses.xml

Excerpt

The range of addresses between 224.0.0.0 and 224.0.0.255, inclusive, is reserved for the use of routing protocols and other low-level topology discovery or maintenance protocols, such as gateway discovery and group membership reporting. Multicast routers should not forward any multicast datagram with destination addresses in this range, regardless of its TTL.

Specifically, 224.0.0.1 is reserved for "All Systems on this Subnet".

I don't know of any command that would confirm that your switches support multicasting. My rule of thumb is: consumer level switches don't. Enterprise level switches do. Everything in between; google is your friend.

And last week I found out the hard way that in enterprise level switches it's configurable too (though I'm no sys admin and I haven't got a clue how to do that...)



来源:https://stackoverflow.com/questions/6932025/multicast-not-received-by-networked-computers

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!