注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

午夜阳光

 
 
 

日志

 
 

广播实现  

2011-10-11 13:36:33|  分类: 广播 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
1 IP地址分类

        A 类网络地址有128 个(支持127)个网络,占有最左边的一个字节(8 位)。高位(0)表示识别这种地址的类型。

        B 类地址使用左边两个8 位用来网络寻址。两个高位(10)用于识别这种地址的类型,其余的14 位用作网络地址,右边的两个字节(16 位)用作网络节点。

        C 类地址是最常见的Internet 地址。三个高位(110)用于地址类型识别,左边三个字节的其余21 位用于寻址。C 类地址支持1046个网络,每个网络可多达256 端点。

        D 类地址是相当新的。它的识别头是1110,用于组播,例如用于路由器修改。

        E 类地址为时延保留,其识别头是11110。


1.1 A类地址


        0.xx.xx.xx ~ 126.xx.xx.xx

        10.0.0.0 ~ 10.255.255.255为私有地址

        127.0.0.0~127.255.255.255为回环地址

        主机ID全0标识一个网络

        主机ID全1表示广播地址

 


1.2 B类地址

        128.xx.xx.xx ~ 191.xx.xx.xx

        172.16.0.0 ~ 172.31.255.255为私有地址

        主机ID全0标识一个网络

        主机ID全1表示广播地址

 


1.3 C类地址

        192.xx.xx.xx ~ 223.xx.xx.xx

        192.168.0.0 ~ 192.168.255.255为私有地址

        主机ID全0标识一个网络

        主机ID全1表示广播地址

 


1.4 D类地址

        224.xx.xx.xx ~ 239.xx.xx.xx


1.5 E类地址

        240.xx.xx.xx ~ 255.xx.xx.xx


2 广播

 


2.1 又一种IP地址分类方法


        有三类IP地址,单播地址、广播地址、多播地址

        单播地址:目的为单个主机

        广播地址:目的为给定网络上的所有主机
        多播地址:目的为同一组类的所有主机

2.2 广播定义

 

        网络对广播地址发出的数据报进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要),由于其不用路径选择,所以其网络成本可以很低廉。

在数据网络中也允许广播的存在,但其被限制在二层交换机的局域网范围内,禁止广播数据穿过路由器,防止广播数据影响大面积的主机。



2.3 广播例子

 

        ARP(地址解析协议),ARP在本地子网上广播一个请求:获取IP地址对应的硬件地址。

        NTP(网络时间协议),服务器以每64秒一次的频率向本地子网上的所有客户广播当前时刻。

        有线电视网就是典型的广播型网络,我们的电视机实际上是接受到所有频道的信号,但只将一个频道的信号还原成画面。



2.4 广播优点

        网络设备简单,维护简单,布网成本低廉

        由于服务器不用向每个客户机单独发送数据,所以服务器流量负载极低。


2.5 帧的过滤过程



2.6 单播帧的过滤过程

        中间主机的以太网接口看到该帧,并将它的目的以太网与自己的以太网地址进行比较。由于二者不相等,接口便忽略该帧。因此,单播帧不会对这台主机造成任何额外开销

        右边主机的以太网接口也看到该帧。并将它的目的以太网与自己的以太网地址进行比较。发现二者相等,接口便读入该帧。


2.7 广播帧的过滤过程

        左边的主机发送的是广播数据报,其地址为128.7.6.255,当左边的主机发送数据报时,它注意到目的IP地址是子网广播地址,于是便将它映射成48位的以太网地址:ff.ff.ff.ff.ff.ff。这使得子网上的每一个以太网接口都会接收该帧。

        由于是广播类型的数据报,右侧的两台主机都将数据报传递到IP层。但是由于中间的主机没有任何应用进程绑定相应的UDP端口,于是主机的UDP代码丢弃这个已收到的数据报。

        以上的例子表明了广播存在一个根本问题:子网上所有未参与广播应用系统的主机也必须完成对数据报的协议处理,直至在UDP层将它丢弃。因此以高速率产生IP数据报的应用系统(例如音频、视频应用程序)会严重影响子网上其他主机的运行,而这类型的应用程序应该采用多播技术来解决该问题。


 
2.8 IP分片和广播

       
        源自Berkeley的内核不允许广播数据报分片.如果发送广播地址的ip数据报超过外出接口的MTU,就返回EMSGSIZE错误

        这是一个自BSD4.2以来就存在的方法.事实上并没有什么原因不让广播数据报分片,只是认为广播已经给网络带来很大负担,没有必要再由于分片而使这种负担扩大数倍



2.9 广播代码示例

 

发送端:


广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光
广播实现 - 小妮子 - 午夜阳光#include<stdio.h>
广播实现 - 小妮子 - 午夜阳光#include<winsock2.h>
广播实现 - 小妮子 - 午夜阳光
广播实现 - 小妮子 - 午夜阳光#pragma comment(lib,"ws2_32.lib")
广播实现 - 小妮子 - 午夜阳光#define BCAST_PORT 5000
广播实现 - 小妮子 - 午夜阳光//#define BCAST_IP "172.16.255.255"
广播实现 - 小妮子 - 午夜阳光
广播实现 - 小妮子 - 午夜阳光void main()
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光{
广播实现 - 小妮子 - 午夜阳光    SOCKET sockfd;
广播实现 - 小妮子 - 午夜阳光    struct sockaddr_in bcastaddr;
广播实现 - 小妮子 - 午夜阳光    int addrlen;
广播实现 - 小妮子 - 午夜阳光    char buf[] = "this is a test message";
广播实现 - 小妮子 - 午夜阳光
广播实现 - 小妮子 - 午夜阳光    WORD wVersionRequested;
广播实现 - 小妮子 - 午夜阳光    WSADATA wsaData;
广播实现 - 小妮子 - 午夜阳光    int err;
广播实现 - 小妮子 - 午夜阳光    
广播实现 - 小妮子 - 午夜阳光    wVersionRequested = MAKEWORD( 2, 2 );
广播实现 - 小妮子 - 午夜阳光    
广播实现 - 小妮子 - 午夜阳光    err = WSAStartup( wVersionRequested, &wsaData );
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光    if ( err != 0 ) 广播实现 - 小妮子 - 午夜阳光{
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光        /**//* Tell the user that we could not find a usable */
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光        /**//* WinSock DLL.                                  */
广播实现 - 小妮子 - 午夜阳光        return;
广播实现 - 小妮子 - 午夜阳光    }
广播实现 - 小妮子 - 午夜阳光    
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光    /**//* Confirm that the WinSock DLL supports 2.2.*/
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光    /**//* Note that if the DLL supports versions greater    */
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光    /**//* than 2.2 in addition to 2.2, it will still return */
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光    /**//* 2.2 in wVersion since that is the version we      */
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光    /**//* requested.                                        */
广播实现 - 小妮子 - 午夜阳光    
广播实现 - 小妮子 - 午夜阳光    if ( LOBYTE( wsaData.wVersion ) != 2 ||
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光        HIBYTE( wsaData.wVersion ) != 2 ) 广播实现 - 小妮子 - 午夜阳光{
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光        /**//* Tell the user that we could not find a usable */
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光        /**//* WinSock DLL.                                  */
广播实现 - 小妮子 - 午夜阳光        WSACleanup( );
广播实现 - 小妮子 - 午夜阳光        return; 
广播实现 - 小妮子 - 午夜阳光    }
广播实现 - 小妮子 - 午夜阳光    
广播实现 - 小妮子 - 午夜阳光    sockfd = socket(AF_INET,SOCK_DGRAM,0);
广播实现 - 小妮子 - 午夜阳光
广播实现 - 小妮子 - 午夜阳光       //然后赋值给地址,用来从网络上的广播地址接收消息
广播实现 - 小妮子 - 午夜阳光    memset(&bcastaddr,0,sizeof(bcastaddr));
广播实现 - 小妮子 - 午夜阳光    bcastaddr.sin_family = AF_INET;
广播实现 - 小妮子 - 午夜阳光    bcastaddr.sin_addr.s_addr = INADDR_BROADCAST;
广播实现 - 小妮子 - 午夜阳光    bcastaddr.sin_port = htons(BCAST_PORT);
广播实现 - 小妮子 - 午夜阳光
广播实现 - 小妮子 - 午夜阳光    bool opt = true;
广播实现 - 小妮子 - 午夜阳光    //设置该套接字为广播类型,
广播实现 - 小妮子 - 午夜阳光    setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, (const char *)&opt, sizeof(opt));
广播实现 - 小妮子 - 午夜阳光    addrlen = sizeof(bcastaddr);
广播实现 - 小妮子 - 午夜阳光    while (1)
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光    广播实现 - 小妮子 - 午夜阳光{
广播实现 - 小妮子 - 午夜阳光        //从广播地址发送消息
广播实现 - 小妮子 - 午夜阳光        int ret = sendto(sockfd,buf,256,0,(sockaddr*)&bcastaddr,addrlen);
广播实现 - 小妮子 - 午夜阳光        printf("send to %s:%u\n",inet_ntoa(bcastaddr.sin_addr),ntohs(bcastaddr.sin_port));
广播实现 - 小妮子 - 午夜阳光        Sleep(2000);
广播实现 - 小妮子 - 午夜阳光    }
广播实现 - 小妮子 - 午夜阳光}


接收端:



广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光
广播实现 - 小妮子 - 午夜阳光#include<stdio.h>
广播实现 - 小妮子 - 午夜阳光#include<winsock2.h>
广播实现 - 小妮子 - 午夜阳光
广播实现 - 小妮子 - 午夜阳光#pragma comment(lib,"ws2_32.lib")
广播实现 - 小妮子 - 午夜阳光#define BCAST_PORT 5000
广播实现 - 小妮子 - 午夜阳光//#define BCAST_IP "172.16.255.255"
广播实现 - 小妮子 - 午夜阳光
广播实现 - 小妮子 - 午夜阳光void main()
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光{
广播实现 - 小妮子 - 午夜阳光    SOCKET sockfd;
广播实现 - 小妮子 - 午夜阳光    struct sockaddr_in bcastaddr,localaddr;
广播实现 - 小妮子 - 午夜阳光    int addrlen;
广播实现 - 小妮子 - 午夜阳光
广播实现 - 小妮子 - 午夜阳光    WORD wVersionRequested;
广播实现 - 小妮子 - 午夜阳光    WSADATA wsaData;
广播实现 - 小妮子 - 午夜阳光    int err;
广播实现 - 小妮子 - 午夜阳光    
广播实现 - 小妮子 - 午夜阳光    wVersionRequested = MAKEWORD( 2, 2 );
广播实现 - 小妮子 - 午夜阳光    
广播实现 - 小妮子 - 午夜阳光    err = WSAStartup( wVersionRequested, &wsaData );
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光    if ( err != 0 ) 广播实现 - 小妮子 - 午夜阳光{
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光        /**//* Tell the user that we could not find a usable */
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光        /**//* WinSock DLL.                                  */
广播实现 - 小妮子 - 午夜阳光        return;
广播实现 - 小妮子 - 午夜阳光    }
广播实现 - 小妮子 - 午夜阳光    
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光    /**//* Confirm that the WinSock DLL supports 2.2.*/
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光    /**//* Note that if the DLL supports versions greater    */
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光    /**//* than 2.2 in addition to 2.2, it will still return */
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光    /**//* 2.2 in wVersion since that is the version we      */
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光    /**//* requested.                                        */
广播实现 - 小妮子 - 午夜阳光    
广播实现 - 小妮子 - 午夜阳光    if ( LOBYTE( wsaData.wVersion ) != 2 ||
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光        HIBYTE( wsaData.wVersion ) != 2 ) 广播实现 - 小妮子 - 午夜阳光{
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光        /**//* Tell the user that we could not find a usable */
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光        /**//* WinSock DLL.                                  */
广播实现 - 小妮子 - 午夜阳光        WSACleanup( );
广播实现 - 小妮子 - 午夜阳光        return; 
广播实现 - 小妮子 - 午夜阳光    }
广播实现 - 小妮子 - 午夜阳光    
广播实现 - 小妮子 - 午夜阳光    memset(&localaddr,0,sizeof(localaddr));
广播实现 - 小妮子 - 午夜阳光    localaddr.sin_family = AF_INET;
广播实现 - 小妮子 - 午夜阳光    localaddr.sin_addr.s_addr = 0;
广播实现 - 小妮子 - 午夜阳光    localaddr.sin_port = htons(BCAST_PORT);
广播实现 - 小妮子 - 午夜阳光
广播实现 - 小妮子 - 午夜阳光    memset(&bcastaddr,0,sizeof(bcastaddr));
广播实现 - 小妮子 - 午夜阳光    bcastaddr.sin_family = AF_INET;
广播实现 - 小妮子 - 午夜阳光    bcastaddr.sin_addr.s_addr = INADDR_BROADCAST;
广播实现 - 小妮子 - 午夜阳光    bcastaddr.sin_port = htons(BCAST_PORT);
广播实现 - 小妮子 - 午夜阳光    
广播实现 - 小妮子 - 午夜阳光    sockfd = socket(AF_INET,SOCK_DGRAM,0);
广播实现 - 小妮子 - 午夜阳光
广播实现 - 小妮子 - 午夜阳光    BOOL opt = TRUE;
广播实现 - 小妮子 - 午夜阳光    setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,(const char*)&opt,sizeof(opt));
广播实现 - 小妮子 - 午夜阳光    bind(sockfd,(sockaddr *)&localaddr,sizeof(localaddr));
广播实现 - 小妮子 - 午夜阳光    
广播实现 - 小妮子 - 午夜阳光    
广播实现 - 小妮子 - 午夜阳光    addrlen = sizeof(bcastaddr);
广播实现 - 小妮子 - 午夜阳光    char buf[1024];
广播实现 - 小妮子 - 午夜阳光    int ret;
广播实现 - 小妮子 - 午夜阳光    while(1)
广播实现 - 小妮子 - 午夜阳光广播实现 - 小妮子 - 午夜阳光    广播实现 - 小妮子 - 午夜阳光{
广播实现 - 小妮子 - 午夜阳光        //从广播地址接收消息,注意用来绑定的地址和接收消息的地址是不一样的
广播实现 - 小妮子 - 午夜阳光        ret = recvfrom(sockfd,buf,256,0,(struct sockaddr*)&localaddr,&addrlen);
广播实现 - 小妮子 - 午夜阳光        buf[ret] = '\0';
广播实现 - 小妮子 - 午夜阳光        
广播实现 - 小妮子 - 午夜阳光        printf("receive from %s:%u\n",inet_ntoa(localaddr.sin_addr),ntohs(localaddr.sin_port));
广播实现 - 小妮子 - 午夜阳光        printf("\tpacket data: %s\n", buf);
广播实现 - 小妮子 - 午夜阳光        Sleep(2000);
广播实现 - 小妮子 - 午夜阳光    }
广播实现 - 小妮子 - 午夜阳光}
广播实现 - 小妮子 - 午夜阳光
  评论这张
 
阅读(294)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018