在VxWorks系统加入组播multicast

上传人:飞*** 文档编号:32941080 上传时间:2018-02-13 格式:DOC 页数:3 大小:36.50KB
返回 下载 相关 举报
在VxWorks系统加入组播multicast_第1页
第1页 / 共3页
在VxWorks系统加入组播multicast_第2页
第2页 / 共3页
在VxWorks系统加入组播multicast_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《在VxWorks系统加入组播multicast》由会员分享,可在线阅读,更多相关《在VxWorks系统加入组播multicast(3页珍藏版)》请在金锄头文库上搜索。

1、在 vxworks 下加入组播提示:vxworks 上单个 socket 加入的组播组有限制在 vxworks 上,如果一个 socket 能够加入的组播组是有一定的限制的。在这里,加入的组播组以interface/group作为标志,因为加入组播组的时候,是需要指定接口与组播地址的。结构体 ip_moptions 定义了多播 socket 的选项,而其中的成员imo_membershipIP_MAX_MEMBERSHIPS则用于保存当前已经加入的多播组。可见,能够加入的多播组,受到数据 imo_membership 大小的限制,而这个限制就是IP_MAX_MEMBERSHIPS。在缺少的 v

2、xworks 源代码中,这个值被定义为 20,如果需要能够加入更多的组,则需要修改此值,并重新编译 vxworks 核心。预备知识:struct ip_mreqstruct in_addr imr_multiaddr;/组播组的 IP 地址struct in_addr imr_interface; /本地某一网络设备接口的 IP 地址;一台主机上可能有多块网卡,接入多个不同的子网,imr_interface 参数就是指定一个特定的设备接口,告诉协议栈只想在这个设备所在的子网中加入某个组播组。有个这两个参数,协议栈就能知道:在哪个网络设备接口上加入哪个组播组。为了简单起见,有些程序中直接写明了

3、IP 地址,在 192.168.2.1 所在的网卡加入组播 236.9.9.2建立 SOCKET 的历程:1、创建 SOCKETNAMEsocket( ) - open a socketint socket(int domain, /* address family (for example, AF_INET) */int type, /* SOCK_STREAM, SOCK_DGRAM, or SOCK_RAW */int protocol /* socket protocol (usually 0) */)DESCRIPTIONThis routine opens a socket and

4、 returns a socket descriptor. The socket descriptor is passed to the other socket routines to identify the socket. The socket descriptor is a standard I/O system file descriptor (fd) and can be used with the close( ), read( ), write( ), and ioctl( ) routines.Available socket types include: SOCK_STRE

5、AM Specifies a connection-based (stream) socket. SOCK_DGRAM Specifies a datagram (UDP) socket. SOCK_RAW Specifies a raw socket.RETURNSA socket descriptor, or ERROR.1) 、我想建立两个 UDP 的 socket,所以:if (UDPSocket_AutoUpModelA = socket (AF_INET, SOCK_DGRAM, 0) = ERROR) printf (UDPSocket_AutoUpModelA fail); r

6、eturn; if (UDPSocket_AutoUpModelB = socket (AF_INET, SOCK_DGRAM, 0) = ERROR) perror (socket); return; 2) 、两个 SOCKET 均要实现能发送,能接收。if (setsockopt (UDPSocket_AutoUpModelA, IPPROTO_IP, IP_MULTICAST_IF, (char *)&ifAddr,sizeof (ifAddr) = ERROR)#ifdef DEBUG_VXWORKSperror (setsockopt IP_MULTICAST_IF error 2:

7、n);#endifif (setsockopt (UDPSocket_AutoUpModelB, IPPROTO_IP, IP_MULTICAST_IF, (char *)&ifAddr,sizeof (ifAddr) = ERROR)#ifdef DEBUG_VXWORKSperror (setsockopt IP_MULTICAST_IF error 2:n); #endif3) 、两个 socket 均要加入组播/*fill in the argument structure to join in the multicast group*/ipMreq.imr_multiaddr.s_a

8、ddr = inet_addr (236.9.9.2);ipMreq.imr_interface.s_addr = DestNetAddr; /*记住,这里是本 socket 所在的 IP 地址,不能是 INADDR_ANY*/if (setsockopt (UDPSocket_AutoUpModelA, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&ipMreq,sizeof (ipMreq) = ERROR)perror (setsockopt IP_MULTICAST_IF error 1:n); close (UDPSocket_AutoUpModel

9、A); 4) 、给组播发送数据的时候,两个 socket 均能接收到。/* 首先端口复用 */if (setsockopt(UDPSocket_AutoUpModelA,SOL_SOCKET,SO_REUSEADDR,(char *)&ifAddr,sizeof(ifAddr) 0) perror(setsockopt SO_REUSEADDR:);/*绑定到 INADDR_ANY*/myAddr.sin_addr.s_addr =htonl(INADDR_ANY); /* bind socket to INADDR_ANY */ if (bind (UDPSocket_AutoUpModelA, (struct sockaddr *) &myAddr, sockAddrSize) = ERROR) perror (bind fail); close (UDPSocket_AutoUpModelA); return; 不收组播包有可能是网口初始化的时候初始化时,网络设备初始化选项配置当中配置选项没有设置。例如:如果网络设备配置为非混杂模式,那么这个网络设备只收目的 MAC 为自己的报文(也收广播) ;如果配置为混杂模式,那么对目的 MAC 基本上没有什么限制。你仔细查查是否在 phy 层就直接将组播包丢弃了。当然了,一般你是看不到统计,仔细看看网络设备的初始化。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 企业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号