多播不联网的电脑收到 [英] Multicast not received by networked computers

查看:101
本文介绍了多播不联网的电脑收到的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想一个组播发送到所有网络计算机。我有我的服务器我的计算机和网络上的其他计算机上设置。当我送出去的多播消息,我的计算机上运行的服务器选了罚款。联网的计算机没有得到任何东西,但。我试过设置TTL到最大值,而且什么也没做。我也试着用监控我的Wireshark的数据包,但没有看到任何东西(我不是很熟练的这个)。我很困惑,为什么我的电脑接收它,而不是其他的网络计算机。这里是code我用发送组播:

 的#include< SYS / types.h中> / *的类型定义* /
#包括LT&;&winsock2.h GT;为赢套接字API / * *调用/
#包括LT&;&ws2tcpip.h GT; / *为赢插座结构* /
#包括LT&;&stdio.h中GT; / *像printf()* /
#包括LT&;&stdlib.h中GT; / *为与atoi()* /
#包括LT&;&string.h中GT; / *函数strlen()* /MAX_LEN的#define 1024 / *最大字符串大小发送* /
#定义MIN_PORT 1024 / *最小端口允许* /
#定义MAX_PORT 65535 / *最大端口允许* /INT主(INT ARGC,CHAR *的argv []){  INT袜子; / *套接字描述符* /
  烧焦send_str [MAX_LEN] / *字符串发送* /
  结构SOCKADDR_IN mc_addr; / *套接字地址结构* /
  INT SEND_LEN; / *字符串长度发送* /
  字符* mc_addr_str; / *组播IP地址* /
  无符号短mc_port; / *播端口* /
  unsigned char型mc_ttl = 255; / *生存时间(跳数)* /
  WSADATA WSADATA; / * Windows套接字DLL结构* /  / *验证的参数的数目* /
  如果(argc个!= 3){
    fprintf中(标准错误,
            用法:%S<组播IP><多播端口与GT; \\ N,
            的argv [0]);
    出口(1);
  }  mc_addr_str =的argv [1]; / * ARG 1:组播IP地址* /
  mc_port =与atoi(argv的[2]); / * ARG 2:播端口号* /  / *验证端口范围* /
  如果((mc_port< MIN_PORT)||(mc_port> MAX_PORT)){
    fprintf中(标准错误,无效端口号参数%d \\ N,
            mc_port);
    fprintf中(标准错误,有效范围为%d到%d之间。\\ n
            MIN_PORT,MAX_PORT);
    出口(1);
  }  / *加载的Winsock 2.0 DLL * /
  如果(调用WSAStartup(MAKEWORD(2,0),&放大器;!WSADATA)= 0){
    fprintf中(标准错误的WSAStartup()失败);
    出口(1);
  }  / *创建一个套接字发送到多播地址* /
  如果((袜子=插座(PF_INET,SOCK_DGRAM,IPPROTO_UDP))小于0){
    PERROR(插座()失败);
    出口(1);
  }  / *设定的TTL(生存时间/跳数)为发送* /
  如果((setsockopt的(袜子,IPPROTO_IP,IP_MULTICAST_TTL,
       (无效*)及mc_ttl,sizeof的(mc_ttl)))< 0){
    PERROR(setsockopt的()失败);
    出口(1);
  }  / *构建一个多播地址的结构* /
  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(开始打字(返回到发送,CTRL-C退出):\\ n);  / *明确的发送缓冲区* /
  memset的(send_str,0,sizeof的(send_str));  而(与fgets(send_str,MAX_LEN,标准输入)){
    SEND_LEN = strlen的(send_str);    / *发送串多播地址* /
    如果((SENDTO(袜子,send_str,SEND_LEN,0,
         (结构sockaddr *)及mc_addr,
         的sizeof(mc_addr)))!= SEND_LEN){
      PERROR(SENDTO()发送的字节数不正确);
      出口(1);
    }    / *明确的发送缓冲区* /
    memset的(send_str,0,sizeof的(send_str));
  }  关闭套接字(袜子);
  WSACleanup(); / *清理Winsock的* /  出口(0);
}


解决方案

请看一看的 http://www.iana.org/assignments/multicast-addresses/multicast-addresses.xml

摘录


  

224.0.0.0和224.0.0.255(含)之间的地址范围,
  保留用于使用路由协议和其他低级别
  拓扑发现或维护协议,如网关发现
  和组成员报告。多播路由器不应该转发
  在此范围内的目的地址组播数据报,
  不管其TTL值的。


具体而言,224.0.0.1是保留该网段上的所有系统。

我不知道会确认你的交换机支持多播的任何命令。我的经验法则是:消费级交换机不。企业级交换机做。两者之间的一切;谷歌是你的朋友。

上周我发现,在企业级交换机它的配置太艰难地(虽然我不是系统管理员,我还没有得到一个线索如何做到这一点?)

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);
}

解决方案

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...)

这篇关于多播不联网的电脑收到的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆