分享
 
 
 

剖析Linux操作系统的网络多播IP技术

王朝system·作者佚名  2008-05-30
窄屏简体版  字體: |||超大  

摘要

多播广播是用于建立分步式系统:例如网络游戏、ICQ聊天构建、远程视频会议系统的重要工具。使用多播广播的程序和UDP向单个介绍方发送信息的程序相似。区别在于多播广播程序使用特殊的多播IP地址。

目录

一、配置Linux支持多播IP

二、使用Linux多播IP广播数据

例如本地计算机的的IP地址是:127.0.0.1二它的多播地址是: 224.0.0.1。这是由RCF 1390定义的。为发送IP多播数据,发送者需要确定一个合适的多播地址,这个地址代表一个组。IPv4多播地址采用D类IP地址确定多播的组。在Internet中,多播地址范围是从224.0.0.0到234.255.255.255。其中比较重要的地址有:

224.0.0.1 - 网段中所有支持多播的主机

224.0.0.2 - 网段中所有支持多播的路由器

224.0.0.4 - 网段中所有的DVMRP路由器

224.0.0.5 - 所有的OSPF路由器

224.0.0.6 - 所有的OSPF指派路由器

224.0.0.9 - 所有RIPv2路由器

IPv6地址空间中有1/256的地址空间分配给多播地址。一个FF(11111111)值标识该地址是多播地址。标识段高三位始终设置为0并保留。第四位T标识设置为0时表示一个永久分配的多播地址。T标识设置为1时,表示非永久分配的多播地址,这种地址作为一个临时的多播地址。

一、配置Linux支持多播IP

在默认状态下,大多Linux发行版本关闭的对多播IP的支持。为了在Linux系统使用多播套接口,需要从新配置和编译Linux内核。下面看一下配置步骤:

1.cd /usr/src/linux

2.make menuconfig

3.选择网络选项

4.选中IP:Enable Multicasting IP一项

5.保存并从menuconfig 退出

6.运行:make dep;make clean;make bzlmage

7.cp/vmlinuz/vdimLz_good

8.cparch/i386/boot/zImage/vmlinzz

9.cd/etc

10.编辑lilo.conf,加入针对/vmlinuz_good的内核新选项

11.运行li1o

Linux内核编译后,以超级用户身份运行命令: #router add –net 224.0.0.0 netmask 224.0.0.0 dev lo

核实命令是否加入系统,运行命令:

#route –eKernel IP routing table

Destination gatewary Genmask Flags MSS Window irtt Iface

10.0.0.0 * 255.255.255.0 U 0 0 0 eth0

127.0.0.0 * 255.0.0.0 U 0 0 0 lo

BASE_ADDRESS>MC * 240.0.0.0 U 0 0 0 lo

Default 10.0.0.1 0.0.0.0 UG 0 0 0 eth0

其中出现多播地址: 224.0.0.1。就表示配置成功了。

二、使用Linux多播IP广播数据

1、首先在服务器端建立多播程序:

服务器端程序代码和解释:

/* * broadcast.c - An IP multicast server */

#include

#include

#include

#include

#include #include

#include int port = 6789;

int main(void)

{

int socket_descriptor;

struct sockaddr_in address;

/* 首先建立套接口 */

socket_descriptor = socket(AF_INET, SOCK_DGRAM, 0);

if (socket_descriptor == -1)

{

perror("Opening socket");

exit(EXIT_FAILURE);

}

/* 初始化IP多播地址 */

memset(&address, 0, sizeof(address));

address.sin_family = AF_INET;

address.sin_addr.s_addr = inet_addr("224.0.0.1");

address.sin_port = htons(port);

/* 开始进行IP多播 */

while(1) {

if(sendto(socket_descriptor, "test from broadcast",

sizeof("test from broadcast"), 0,

(struct sockaddr *)&address, sizeof(address)) < 0)

{

perror("sendto");

exit(EXIT_FAILURE);

}

sleep(2);

}

exit(EXIT_SUCCESS);}

2、创建Linux客户端的程序多播IP广播

建立好广播服务器后,就需要一个客户端的收听程序,收听多播IP广播要求在程序中作以下几项工作:

(1)、多播方收听,客户端编写通知Linux内核每个指定的套接口加入多播IP广播组。

(2)、收听方必须运行在同一个Linux计算机的不同进程的同一个套接口。

(3)、编写配置端口设定广播信息可以发送给同一个Linux主机,这样作的用处是在同一个Linux主机上测试广播程序和收听程序,易于调试。

客户端程序代码和解释:

/* * listen.c - An IP multicast client */

#include

#include

#include

#include

#include

#include

#include

char * host_name = "224.0.0.1";

/* 多播IP地址 */

int port = 6789;

int main(void)

{

struct ip_mreq command;

int loop = 1;

/* 多播循环 */

int iter = 0;

int sin_len;

char message[256];

int socket_descriptor;

struct sockaddr_in sin;

struct hostent *server_host_name;

if((server_host_name = gethostbyname(host_name)) == 0)

{

perror("gethostbyname");

exit(EXIT_FAILURE);

}

/*bzero(&sin, sizeof(sin));*/

memset(&sin, 0, sizeof(sin));

sin.sin_family = AF_INET;

sin.sin_addr.s_addr = htonl(INADDR_ANY);

sin.sin_port = htons(port);

if((socket_descriptor = socket(PF_INET, SOCK_DGRAM, 0)) == -1)

{ perror("socket");

exit(EXIT_FAILURE);

}

/* 调用bind之前,设置套接口选项启用多播IP支持*/

loop = 1;

if(setsockopt(socket_descriptor,

SOL_SOCKET, SO_REUSEADDR,

&loop, sizeof(loop)) < 0)

{

perror("setsockopt:SO_REUSEADDR");

exit(EXIT_FAILURE);

}

if(bind(socket_descriptor,

(struct sockaddr *)&sin, sizeof(sin)) < 0)

{

perror("bind");

exit(EXIT_FAILURE);

}

/* 在同一个主机上进行广播设置套接口,

作用是方便单个开发系统上测试多播IP广播 */

loop = 1;

if(setsockopt(socket_descriptor,

IPPROTO_IP, IP_MULTICAST_LOOP,

&loop, sizeof(loop)) < 0)

{

perror("setsockopt:IP_MULTICAST_LOOP");

exit(EXIT_FAILURE);

}

/* 加入一个广播组。进一步告诉Linux内核,

特定的套接口即将接受广播数据*/

command.imr_multiaddr.s_addr = inet_addr("224.0.0.1");

command.imr_interface.s_addr = htonl(INADDR_ANY);

if(command.imr_multiaddr.s_addr == -1)

{

perror("224.0.0.1 not a legal multicast address");

exit(EXIT_FAILURE);

}

if (setsockopt(socket_descriptor, IPPROTO_IP, IP_ADD_MEMBERSHIP,

&command, sizeof(command)) < 0)

{

perror("setsockopt:IP_ADD_MEMBERSHIP");

}

while(iter++ < 8)

{

sin_len = sizeof(sin);

if(recvfrom(socket_descriptor, message, 256, 0,

(struct sockaddr *)&sin, &sin_len) == -1) {

perror("recvfrom");

}

printf("Response #%-2d from server: %s\n", iter, message);

sleep(2); }

/* 接受8个广播后退出 */

if(setsockopt(socket_descriptor, IPPROTO_IP, IP_DROP_MEMBERSHIP,

&command, sizeof(command)) < 0) {

perror("setsockopt:IP_DROP_MEMBERSHIP");

}

close(socket_descriptor);

exit(EXIT_SUCCESS);}

3、运行Linux多播IP程序

运行程序,打开两个终端窗口并在每个窗口中输入以上的源代码。在一个窗口中键入make,编译broadcast和1isten这两个的可执行文件,由GUN make建立一个Makfiles文件。GUN make是Linux系统中一个自动生成和维护目标程序的工具。

在一个窗口中通过执行./broadcast,在另一个的窗口执行./listen,启动收听程序,你应该看到如下输出:

#./listenResponse #1 form sever :test from broadcast

Response #2 form sever :test from broadcast

Response #3 form sever :test from broadcast

Response #4 form sever :test from broadcast

Response #5 form sever :test from broadcast

Response #6 form sever :test from broadcast

Response #7 form sever :test from broadcast

Response #8 form sever :test from broadcast

#

4、总结

Linux多播IP是一种同时向价格进程高效的发送信息的介绍。多播传输中,数据被发送到接收者的多播地址,而不是每个接收者的单播地址,发送者只发送一个数据拷贝,源端到目标端路径上的中间节点复制该数据。现在多播IP已经广泛应用于网络游戏、视频广播的领域。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有