UDP单播、广播、多播




单播:就是我们常见的包含s端和c端的一对一方式,要c端向s端发生前要先明确指明s端的ip及port;

编程说明:略


广播:又叫分有限广播和和直接广播。

有限广播:

使用的地址是255.255.255.255,即向该ip的任何一个端口发生数据,数据将发生给该局域网内的所有主机的同一端口,因为广播地址(255.255.255.255)是不会被路由器路由的,智能到达本物理网络内的主机,这一点不能理解:如果可以被路由的话,那势必造成网络的瘫痪。

直接广播:

在使用TCP/IP 协议的网络中,主机标识段host ID 为全1 的IP 地址为广播地址。如果你的IP为:192.168.1.39,子网掩码为:255.255.255.0,则广播地址为:192.168.1.255;如果IP为192.168.1.39,子网掩码为:255.255.255.192,则广播地址为:192.168.1.63。如果只想在本网络内广播数据,只要向广播地址发送数据包即可,这种数据包可以被路由,它会经由路由器到达本网段内的所有主机,此种广播也叫直接广播;

广播一般用于同一个局域网内的用户进行互动聊天,如同一本地的游戏玩家进行信息的交流。

编程说明:

发送方向广播地址(255.255.255.255)发送数据,需要设置发送方允许发送广播包:

setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt));  //设置套接字为广播类型

接收方不需要设置接收广播包


多播:

IP多播通信必须依赖于IP多播地址,在IPv4中它是一个D类IP地址,范围从224.0.0.0到239.255.255.255,并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类。其中,

局部链接多播地址范围在224.0.0.0~224.0.0.255,这是为路由协议和其它用途保留的地址,路由器并不转发属于此范围的IP包;

预留多播地址为224.0.1.0~238.255.255.255,可用于全球范围(如Internet)或网络协议;

管理权限多播地址为239.0.0.0~239.255.255.255,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。

多播技术(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, sockfdsocket建立的套接字,这一步就是允许了多进程共享同一个端口。接着,是通用的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)); 来退出多播组。


链接:http://blog.chinaunix.net/uid-21712186-id-1818361.html

展开阅读全文

没有更多推荐了,返回首页