C/S架构学习之广播

  • 广播:
  • 一台主机可以将一个数据包同时发送给同一局域网所有主机
  • IPV4中,广播地址本网段最大的IP地址或者"255.255.255.255";
  • 注意:
  • 广播本质上是UDP通信技术;
  • 只有用户数据报套接字才能使用广播的方式;
  • 设置广播的流程:
  • 发送方(UDP的客户端):
  • 一、创建用户数据报套接字(socket函数):
c 复制代码
	int sockfd = socket(AF_INET,SOCK_DGRAM,0);
    if(-1 == sockfd)
    {
        perror("sockfd error");
        exit(-1);
    }
  • 二、填充广播信息结构体( struct sockaddr_in):
c 复制代码
	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);
  • 三、设置允许发送广播(setsockopt函数):
c 复制代码
	int opt = 1;
    if(-1 == (setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&opt,sizeof(opt))))
    {
        perror("setsockopt error");
        exit(-1);
        
    }
  • 四、发送广播信息(sendto函数):
c 复制代码
	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);

        }
    }
  • 五、关闭用户数据报套接字(close函数):
c 复制代码
 	close(sockfd);
  • 接收方(UDP的服务器):
  • 一、创建用户数据报套接字(socket函数):
c 复制代码
	int sockfd = socket(AF_INET,SOCK_DGRAM,0);
    if(-1 == sockfd)
    {
        perror("sockfd error");
        exit(-1);
    }
  • 二、填充广播信息结构体(struct sockaddr_in):
c 复制代码
	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);
  • 三、用户数据报套接字和广播信息结构体绑定(bind函数):
c 复制代码
	if(-1 == (bind(sockfd,(struct sockaddr *)&serveraddr,serveraddr_len)))
    {
        perror("bind error");
        exit(-1);
    }
  • 四、接收广播信息(recvfrom函数):
c 复制代码
	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);
    }
  • 五、关闭用户数据报套接字(close函数):
c 复制代码
 	close(sockfd);
相关推荐
项目題供诗15 分钟前
黑马python(二十四)
开发语言·python
就改了39 分钟前
JUC小册——公平锁和非公平锁
java·开发语言
小林C语言1 小时前
C语言 | 判断是否为回文数
c语言
一粒沙白猫1 小时前
Java综合练习04
java·开发语言·算法
哎呦你好1 小时前
【CSS】Grid 布局基础知识及实例展示
开发语言·前端·css·css3
一入JAVA毁终身2 小时前
处理Lombok的一个小BUG
java·开发语言·bug
Hellyc2 小时前
JAVA八股文:异常有哪些种类,可以举几个例子吗?Throwable类有哪些常见方法?
java·开发语言
听风ツ2 小时前
固高运动控制
学习
西岭千秋雪_2 小时前
Redis缓存架构实战
java·redis·笔记·学习·缓存·架构
XvnNing2 小时前
【Verilog硬件语言学习笔记4】FPGA串口通信
笔记·学习·fpga开发