Chinaunix首页 | 论坛 | 博客
  • 博客访问: 10725519
  • 博文数量: 2905
  • 博客积分: 20098
  • 博客等级: 上将
  • 技术积分: 36298
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-23 05:00
文章存档

2012年(1)

2011年(3)

2009年(2901)

分类: LINUX

2009-03-23 11:06:30

纲要:
  多播技术(Multicast)常常用来编制分布式的聊天、流体音频,和视频等等应用
程序。在Linux中使用多播技术,与使用UDP给单个用户发送消息,没有多大的区别,只
是你要使用一个特殊的多播IP地址,还有一些环境需要改变一下。

正文:
                         Linux多播技术的使用和编程
作者:stone
  多播技术(Multicast)常常用来编制分布式的聊天、流体音频,和视频等等应用程
序。在Linux中使用多播技术,与使用UDP给单个用户发送消息,没有多大的区别,只是
你要使用一个特殊的多播IP地址,还有一些环境需要改变一下。
  一般的网卡,都是支持多播技术的,但是操作系统不一定。Linux一般在缺省状态编
译时,可能都不支持Multicast,你需要从新配置和编译你的内核,使它支持多播,然后
你需要使用类似这样的命令:
route add -net 224.0.0.0 netmask 240.0.0.0 dev lo
  要编译和配置内核,只是在配置的网络部分选项中选中:enable multicast ip,然
后编译,编辑lilo的配置文件lilo.conf,就可以搞定。
  在使用多播技术时,除了通常使用的socket函数外,还需要使用getsockopt()和se
tsockopt() 来支持multicast。你可以运行“man multicast”,看看它的各种选项。编
制多播的程序,也分为两方面,一个是broadcast data的服务程序,另一个是监听mult
icast ip 广播数据的客户端程序。
  服务程序的编制和普通UDP服务程序的编制一样,只是在你的sockaddr_in结构的初
始化时,赋值给它的sin_addr。s_addr使用inet_addr("224.0.0.1")给一个特殊的Muti
cast IP值就可以了。
  在客户端的编制方面,相对复杂一点。一般我们需要先使用gethostbyname,得到服
务器的信息。然后使用socket(AF_INET,SOCK_DGRAM,0)建立套接字,我们接着调用 set
sockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&share,sizeof(share)),其中,char shar
e = 1, sockfd是socket建立的套接字,这一步就是允许了多进程共享同一个端口。接着
,是通用的bzero(), 给sockaddr_in填入信息,bind(),下来,我们要通知Linux kerne
l来的数据是广播数据,这一步通过给optval付值来搞定,如 optval.imr_multiaddr.s
_addr = inet_addr("224.0.0.1"); optval.imr_interface.s_addr = htonl(INADDR_A
NY); 先面的这一步,则用来使自己的主机加入一个广播组: setsockopt(sockfd, IPP
ROTO_IP, IP_ADD_MEMBERSHIP, &optval, sizeof(command)); 现在,你可以使用recvf
rom()来接收多播数据了,当然,最后你还要使用: setsockopt(sockfd, IPPROTO_IP,
IP_DROP_MEMBERSHIP, &optval, sizeof(optval)); 来退出多播组。
阅读(921) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~