Multicast Sockets

来源:互联网 发布:网络黄金是什么 编辑:程序博客网 时间:2024/06/11 22:47


以下是在UNIX (FreeBSD)下进行多播编程需要注意的几点:


  1. 发送socket. 通常在发送端不需要做特别的处理,关键是只要发送到一个多播IP地址
    要点:
    • 用 socket() 创建socket 带 AF_INET 和 SOCK_DGRAM 参数.
    • 用 bind() 绑定到本地地址和端口.
    • 不要用 connect() 去连接多播目的地址.
    • 用 sendto() 发送数据.

  2. 接收socket. 接收除了要增加系统调用: setsockopt()以外,其它几乎和往常一样.
    • 用 socket() 创建socket 带 AF_INET 和 SOCK_DGRAM 参数.
    • 用 setsockopt() 带 IP_ADD_MEMBERSHIP 选项. 告诉系统接收目的地址是组播地址(自己发的除外)的网络包. 
      以下是C++写的一个例子:

        struct sockaddr_in sockaddr_group;  struct hostent *group;  struct ip_mreq mreq;  bzero(&mreq,sizeof(struct ip_mreq));    // set group  if ((group = gethostbyname(ghost))==(struct hostent *)0) {    cerr << "gethostbyname error: fails for host " << host << endl;    exit(-1);  }  struct in_addr ia;  bcopy((void*)group->h_addr, (void*)&ia, group->h_length);   bcopy(&ia, &mreq.imr_multiaddr.s_addr, sizeof(struct in_addr));  // set interface  mreq.imr_interface.s_addr = htonl(INADDR_ANY);  // do membership call  if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(struct ip_mreq))       == -1) {    cerr << "error: setsockopt(IP_ADD_MEMBERSHIP) fails with errno "  << errno << endl;    exit(-1);  }

    • 用 bind() 绑定到本地地址和端口.
    • 不要用 connect() 去连接多播目的地址.
    • 用 recvfrom() 接收数据.

  3. 其它多播选项.
    IP_MULTICAST_IF    /* u_char; set/get IP multicast i/f  */        IP_MULTICAST_TTL   /* u_char; set/get IP multicast ttl */        IP_MULTICAST_LOOP  /* u_char; set/get IP multicast loopback */        IP_ADD_MEMBERSHIP  /* ip_mreq; add an IP group membership */        IP_DROP_MEMBERSHIP /* ip_mreq; drop an IP group membership */
    用 IP_ADD_MEMBERSHIP 和 IP_DROP_MEMBERSHIP 切换接收socket监听的多播组. 如果发送端想同时接收一份发往多播组的拷贝设置 IP_MULTICAST_LOOP 选项





    原文:http://www.cs.unc.edu/~jeffay/dirt/FAQ/comp249-001-F99/mcast-socket.html
0 0