Linux多播技术的使用和编程
ChinaByte 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()和setsockopt() 来支持multicast。你可以运行“man multicast”,看看它的各种选项。编制多播的程序,也分为两方面,一个是broadcast data的服务程序,另一个是监听multicast ip 广播数据的客户端程序。
服务程序的编制和普通UDP服务程序的编制一样,只是在你的sockaddr_in结构的初始化时,赋值给它的sin_addr。s_addr使用inet_addr(\"224.0.0.1\")给一个特殊的Muticast IP值就可以了。
在客户端的编制方面,相对复杂一点。一般我们需要先使用gethostbyname,得到服务器的信息。然后使用socket(AF_INET,SOCK_DGRAM,0)建立套接字,我们接着调用 setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&share,sizeof(share)),其中,char share = 1, sockfd是socket建立的套接字,这一步就是允许了多进程共享同一个端口。接着,是通用的bzero(), 给sockaddr_in填入信息,bind(),下来,我们要通知Linux kernel来的数据是广播数据,这一步通过给optval付值来搞定,如 optval.imr_multiaddr.s_addr = inet_addr(\"224.0.0.1\"); optval.imr_interface.s_addr = htonl(INADDR_ANY); 先面的这一步,则用来使自己的主机加入一个广播组: setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &optval, sizeof(command)); 现在,你可以使用recvfrom()来接收多播数据了,当然,最后你还要使用: setsockopt(sockfd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &optval, sizeof(optval)); 来退出多播组。
发布人:netbull 来自:Linux专区