• C/S架构学习之广播


    • 广播:
    • 一台主机可以将一个数据包同时发送给同一局域网所有主机
    • IPV4中,广播地址本网段最大的IP地址或者“255.255.255.255”;
    • 注意:
    • 广播本质上是UDP通信技术;
    • 只有用户数据报套接字才能使用广播的方式;
    • 设置广播的流程:
    • 发送方(UDP的客户端):
    • 一、创建用户数据报套接字(socket函数):
    	int sockfd = socket(AF_INET,SOCK_DGRAM,0);
        if(-1 == sockfd)
        {
            perror("sockfd error");
            exit(-1);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 二、填充广播信息结构体( struct sockaddr_in):
    	struct sockaddr_in serveraddr;
        socklen_t serveraddr_len = sizeof(serveraddr);
        memset(&serveraddr,0,serveraddr_len);
        serveraddr.sin_family = AF_INET;
        serveraddr.sin_addr.s_addr = inet_addr(IP);
        serveraddr.sin_port = htons(PORT);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 三、设置允许发送广播(setsockopt函数):
    	int opt = 1;
        if(-1 == (setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&opt,sizeof(opt))))
        {
            perror("setsockopt error");
            exit(-1);
            
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 四、发送广播信息(sendto函数):
    	char buf[128] = {0};
        while(true)
        {
            memset(buf,0,sizeof(buf));
            fgets(buf,128,stdin);
            buf[strlen(buf)-1] = '\0';
            if(!strncmp(buf,"quit",4))
            {
    
                break;
    
            }
    
            //给服务器发送数据
            if(-1 == (sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr*)&serveraddr,serveraddr_len)))
            {
                perror("sendto error");
                exit(-1);
    
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 五、关闭用户数据报套接字(close函数):
     	close(sockfd);
    
    • 1
    • 接收方(UDP的服务器):
    • 一、创建用户数据报套接字(socket函数):
    	int sockfd = socket(AF_INET,SOCK_DGRAM,0);
        if(-1 == sockfd)
        {
            perror("sockfd error");
            exit(-1);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 二、填充广播信息结构体(struct sockaddr_in):
    	struct sockaddr_in serveraddr,clientaddr;
        socklen_t serveraddr_len = sizeof(serveraddr);
        socklen_t clientaddr_len = sizeof(clientaddr);
        memset(&serveraddr,0,serveraddr_len);
        serveraddr.sin_family = AF_INET;
        serveraddr.sin_addr.s_addr = inet_addr(IP);
        serveraddr.sin_port = htons(PORT);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 三、用户数据报套接字和广播信息结构体绑定(bind函数):
    	if(-1 == (bind(sockfd,(struct sockaddr *)&serveraddr,serveraddr_len)))
        {
            perror("bind error");
            exit(-1);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 四、接收广播信息(recvfrom函数):
    	char buf[128] = {0};
        while(true)
        {
            memset(buf,0,sizeof(buf));
            //接收客户端发来的消息
            if(-1 == (recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr*)&clientaddr,&clientaddr_len)))
            {
                perror("recvfrom error");
                exit(-1);
    
            }
    
            printf("客户端[%s:%d]发来数据[%s]\n",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port),buf);
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 五、关闭用户数据报套接字(close函数):
     	close(sockfd);
    
    • 1
  • 相关阅读:
    php中mcrypt_encrypt升级到openssl_encrypt
    Android codec2 视频框架 之应用
    判断序列是否为正确的出栈序列
    免费的快速手机文件解压APP,快冲
    【对称美学/对称字符串】python实现-附ChatGPT解析
    真实环绕的魅力,飞利浦杜比全景声影院B8967开箱
    暑期JAVA学习(42.1)TCP通信——使用线程池优化
    (附源码)SSM宠物领养系统 毕业设计 031654
    编译调试Net6源码
    C语言 位操作符 >> << & | ^
  • 原文地址:https://blog.csdn.net/qq_41878292/article/details/134210425