Linux(网络编程):05---UDP广播通信

è¿éåå¾çæè¿°

一、广播的概念

广播(broadcast)是指封包在计算机网络中传输时,目的地址为网络中所有设备的一种传输方式。实际上,这里所说的“所有设备”也是限定在一个范围之中,称为“广播域” 

二、组播的优点/特点

  • 广播只能在一个广播域(局域网)中传播,而不能跨网段传播。发出的数据包,局域网的所有主机都能收到这个数据包
  • 广播通信由UDP实现
  • 路由器不转发广播数据包。交换机会转发广播数据包
  • 并非所有的计算机网络都支持广播,例如X.25网络和帧中继都不支持广播,而且也没有在“整个互联网范围中”的广播。IPv6亦不支持广播,广播相应的功能由多播代替
  • 通常,广播都是限制在局域网中的,比如以太网或令牌环网络。因为广播在局域网中造成的影响远比在广域网中小得多

三、广播的缺点

  • 无法针对每个客户的要求和时间及时提供个性化服务。
  • 网络允许服务器提供数据的带宽有限,客户端的最大带宽=服务总带宽。例如有线电视的客户端的线路支持100个频道(如果采用数字压缩技术,理论上可以提供500个频道),即使服务商有更大的财力配置更多的发送设备、改成光纤主干,也无法超过此极限。也就是说无法向众多客户提供更多样化、更加个性化的服务。
  • 广播禁止在Internet宽带网上传输

四、广播的地址

  • 广播的IP地址(Host ID全为1):例如192.168.43.255
  • 广播的MAC地址:FF:FF:FF:FF:FF:FF

五、广播的实现

接收端

  • 像普通的一个UDP接收端一样,绑定自己的地址准备接受信息即可

发送端

  • 使用setsockopt函数对socket进行设置(将当前socket设置为一个广播socket,这样局域网其他人就可以接收到)
int yes=1;
setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&yes,sizeof(yes));

六、案例

发送端

  • 使用时提供一个IP和端口(要发送去哪里的IP和端口)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<errno.h>
#include<arpa/inet.h>

int main(int argc,char *argv[])
{
    if(argc!=3){
        printf("Please Enter %s [IP] [PORT]\n",argv[0]);
        exit(EXIT_FAILURE);
    }

    //create socket
    int sock=socket(AF_INET,SOCK_DGRAM,0);
    if(sock<0){
        perror("Create Sock Fila\n");
        exit(EXIT_FAILURE);
    }
    else{
        printf("Create Sock Success\n");
    }

    //setsockopt
    int yes=1;
    setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&yes,sizeof(yes));

    //set sendto who
    struct sockaddr_in s_addr;
    s_addr.sin_family=AF_INET;
    s_addr.sin_port=htons(atoi(argv[2]));
    s_addr.sin_addr.s_addr=inet_addr(argv[1]);

    int addr_len=sizeof(s_addr);
    char buf[128];
    strcpy(buf,"I am a broadcast package\n");

    //sendto
    int len=sendto(sock,buf,strlen(buf),0,(struct sockaddr*)&s_addr,addr_len);
    if(len>0){
        printf("Send Success\n");
    }
    else{
        printf("Send Fail\n");
    }
    close(sock);
    return 0;
}

接收端

  • 使用时提供一个自己的端口即可
  • 接收端不需要设置sock可选项,使用起来跟普通的UDP通信服务端一样为自己绑定一个地址用来接受广播信息即可 
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<errno.h>
#include<arpa/inet.h>

int main(int argc,char *argv[])
{
    if(argc!=2){
        printf("Please Enter %s [PORT]\n",argv[0]);
        exit(EXIT_FAILURE);
    }

    //create socket
    int sock=socket(AF_INET,SOCK_DGRAM,0);
    if(sock<0){
        perror("Create Sock Fail\n");
        exit(EXIT_FAILURE);
    }
    else{
        printf("Create Sock Success\n");
    }

    struct sockaddr_in local;
    local.sin_family=AF_INET;
    local.sin_port=htons(atoi(argv[1]));
    local.sin_addr.s_addr=INADDR_ANY;
    //bind address
    if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0){
        perror("Bind Fila\n");
        close(sock);
        exit(EXIT_FAILURE);
    }
    else{
        printf("Bind Success\n");
    }

    struct sockaddr_in peer;
    char buf[128];
    int len;
    socklen_t addr_len=sizeof(peer);
    while(1)//recvfrom message
    {
        len=recvfrom(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&peer,&addr_len);
        if(len>0){
            buf[len]='\0';
            printf("RecvMessage From %s/%d:%s",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port),buf);
        }
        else
        {
            perror("Recv Fila\n");
            exit(EXIT_FAILURE);
        }
    }
    close(sock);
    return 0;
}

四、如何干掉HDCP(广播的应用之一)

  • DHCP:自动分配IP地址协议
  • 广播会去寻找局域网内的主机,如果找到主机就使用DHCP协议给这个主机分配一个IP地址。但是如果广播被占领了,DHCP就识别不到主机了,因此也就不能分配IP地址了

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/88823993
今日推荐