在Windows系统和VxWorks系统上实现IP多播

原创 2004年04月27日 23:58:00

在Windows系统和VxWorks系统上实现IP多播

作者 杨登峰 2004/04/24
多播在视频会议的应用是非常广的。笔者就学习中得到的体会来与大家共享。
(一)多播概要
多播有控制层面(control plane),数据层面(control plane)。
(1)控制层面分 有根的(Rooted),无根的(Nonrooted)。有根结点负责多播结点的建立,以及其它结点的加入。无根多播网络,每个主机在加入组的时候条件都是都是等价的。
(2)数据层面也分有根的,无根的。有根的模型,数据成员只能够与跟结点交换数据,普通成员之间数据是不可以交换的。而无跟的模型,每个成员之间数据都是可以相互交换。既只要把数据送到多播组,组里面的每个结点都会收到;只要接收多播组的数据,任何一个组成员发送的数据,都会收到。
IP多播在控制层面和数据层面都是无根的。

(二)IP多播
多播的IP地址是D类地址:224.0.0.0~239.255.255.255。其中有一些IP是保留的。比如224.0.0.1表示子网所有系统,224.0.0.2表示子网上所有的路由器。关于这方面RFC1700中有比较详细的说明。
多播数据在一子网络内部传输时,因为在一个物理层上,主要通过多播的MAC地址来传输给子网,而加了多播的主机的网口就会收到响应多播MAC地址的数据包。
多播MAC地址的构成:
47            23  22                           0
______________________________
| 0x01005e | 0 | 多播IP地址后23位  |
|_________|__|__________________|
网口接受到了加入多播组对应MAC地址数据包后,再传给设备驱动层,驱动层会检验数据包是否书本多播地址。因为多播IP是32位,除了开始四位相同,还要28位才能够完全区分,而MAC地址中只用了28的后23位来区分,必然不能够做到唯一确定,因此在驱动层要检验网落上的数据包是否是主机所加入的多播组数据。我们在创建多播组的时候,要尽量做到后23位不重复,这样就可以直接在硬件上就可以区分多播了。不要浪费宝贵的CPU时间。

(三)IGMP协议
当路由器接受到多播数据,它必要要知道网络的哪些主机加了哪些多播组。IGMP就是基于这样的原因产生的。
(1)当主机加入多播组的时候,就会给路由器发送一个加入多播组的IGMP包。
(2)路由器每隔一段时间就通过发送一个IGMP查询,来了解当前多播组成员的情况。加入多播组的主机会返回一个IGMP报告。
Internet组管理协议,是为了让物理网落上的所有系统知道主机所在多播组。
更详尽的IGMP说明参见RFC 1112[Deering 1989]

(四)实现细节
(1)流程
创建一个SOCKET, 创建一个SOCKET
bind(); bind
加入多播组 加入多播组
sengto(); recvfrom();
... ...

退出多播组 退出多播组

(2)Window
int ret = WSAStartup( MAKEWORD( 2, 2 ), &wsaData );
if ( ret != 0 ) {
 // deal with the error.
}

m_SockManager = socket( AF_INET, SOCK_DGRAM, 0 );
if( INVALID_SOCKET == m_SockManager )
{
// deal with the error.
}

struct sockaddr_in Local_addr_in;
Local_addr_in.sin_family = AF_INET;
Local_addr_in.sin_port = htons( m_uPort);
Local_addr_in.sin_addr.s_addr = htonl( INADDR_ANY );

iError = bind( m_SockManager, (const struct sockaddr*)&Local_addr_in,/
sizeof(Local_addr_in) );
if( SOCKET_ERROR == iError )
{
// deal with the error.
}

m_Mcast.imr_interface.s_addr = INADDR_ANY;
m_Mcast.imr_multiaddr.s_addr = htonl(m_ipMcastAddr);

iError = setsockopt(m_SockManager, IPPROTO_IP, IP_ADD_MEMBERSHIP,/
(char *)&m_Mcast, sizeof(m_Mcast));
if( SOCKET_ERROR == iError )
{
// deal with the error.
}
//发送多播数据
int iRet = sendto( m_SockManager, sendBuf, strlen(sendBuf), 0,/
(struct sockaddr *)&m_Remote, sizeof(m_Remote) );
//接收多播数据
int iRet = recvfrom( m_SockManager, recvBuf, iLenBuf, 0,
(struct sockaddr *)&SockFrom, &iLenData );
if( SOCKET_ERROR == iRet )
{
// deal with the error.
}
其中,多播的端口,要根据发送的远端地址来确定。接收端再响应协调。

(3)VxWorks
Vxworks与上面WinSock1.1基本上都是一样的。
但是在bind()的时候,VxWorks系统本机的IP只能设置为INADDR_ANY,否则绑定失败(网上看到,风河公司已经Fix了这个 BUG了)。不过可以在绑定后调用SetSockopt()来指定本地的interface.
struct in_addr in_if;
in_if.s_addr = inet_addr("10.9.1.25");//具体的本地的地址,可根据情况而定.
setsockopt( sockManager, IPPROTO_IP, IP_MULTICAST_IF, (char*)&in_if, sizeof(in_if));

本文所附Demo实例程序,Windows版在vc6.0开发环境Win2K professional SP4上实现。VxWorks版本在Tornado 2.0开发环境,公司内部的VxWorks操作系统上实现。

因学疏才浅,不当之处欢迎指出: dengfengyang@hotmail.com

WINSOCK2实现IP组播

IP多播(也称多址广播或组播)技术,是一种允许一台或多台主机(多播源)发送单一数据包到多台主机(一次的,同时的)的TCP/IP网络技术。多播作为一点对多点的通信,是节省网络带宽的有效方法之一。在网络音...
  • fin86889003
  • fin86889003
  • 2014年05月15日 14:17
  • 822

计算机网络(六)---IP多播

IP多播是需要在因特网上增加更多的智能才能提供的一种服务。 与单播相比,在一对多的通信中,多播可大大节约网络资源。当采用多播方式时,视频服务器只需要把视频分组当作多播数据报来发送,并且只需发送一次。当...
  • QQ1170836331
  • QQ1170836331
  • 2016年12月13日 10:57
  • 1562

《TCP/IP详解卷2:实现》笔记--IP多播

D类IP地址(224.0.0.0到239.255.255.255)不识别互联网内的单个接口,但识别接口组,被称为多播组。...
  • TODD911
  • TODD911
  • 2014年08月19日 22:27
  • 4744

组播(多播)的C程序实战

每个人都有不同的认知规律和习惯, 有的人喜欢搞一套严密的大理论, 论述起来滔滔不绝, 不管自己懂不懂, 反正读者/听者是没搞懂。 有的人喜欢从实践出发, 没看到代码, 不运行一下, 不看到结果, 就不...
  • stpeace
  • stpeace
  • 2015年05月21日 23:25
  • 6365

Linux下的TCP/IP编程----多播和广播的实现

在前边我们实现的都是服务端客户端这样点对点的通讯,数据只是从一个点到另一个点,但是当我们需要将一份数据同时发给指定的多个人时就遇到了问题,总不能建立多个TCP的长连接或者是多个UDP数据报吧。这时我们...
  • wqc_CSDN
  • wqc_CSDN
  • 2016年06月05日 13:54
  • 2726

TCP/IP详解:协议(UDP,广播和多播)

第11章:UDP:用户数据报协议 UDP不提供可靠性 TCP端口号由TCP来查看,UDP端口号由UDP来查看;TCP端口号与UDP端口号是相互独立的 UDP首部   UDP校验和可选,覆盖UD...
  • u014451076
  • u014451076
  • 2016年10月17日 09:51
  • 5295

一个多播例子的服务器端与客户端

下面是一个多播服务器的例子。多播服务器的程序设计很简单,建立一个数据包套接字,选定多播的IP地址和端口,直接向此多播地址发送数据就可以了。多播服务器的程序设计,不需要服务器加入多播组,可以直接向某个多...
  • u013529907
  • u013529907
  • 2014年06月25日 15:35
  • 851

《TCP/IP详解卷2:实现》笔记--IP多播选路

本文讨论在Net/3中的多播选路程序mrouted2.0。
  • TODD911
  • TODD911
  • 2014年08月26日 17:18
  • 1596

通过多播实现局域网上线用户列表 c++实现

多人在局域网上线,实现用户列表的步骤。 1、程序启动(初始化),单独只有自己。 2、发送广播,给其它用户。 3、接收其它用户发送的信息。 4、更新自己的用户列表 为了简化程序,用控制台实现,...
  • mycoolme5
  • mycoolme5
  • 2016年05月27日 16:43
  • 654

获取本机ip地址,并自动区分Windows还是linux操作系统

public static List getLocalIP() { List localIps=new ArrayList(); InetAddress ip = null; try {...
  • wym1581
  • wym1581
  • 2016年01月25日 17:17
  • 761
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在Windows系统和VxWorks系统上实现IP多播
举报原因:
原因补充:

(最多只允许输入30个字)