Webserver(4.8)UDP、广播、组播

目录

UDP通信

server.c

cpp 复制代码
#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
int main(){

    //1.创建一个通信的socket
    int fd=socket(PF_INET,SOCK_DGRAM,0);
    if(fd==-1){
        perror("socket");
        exit(-1);
    }


    struct sockaddr_in addr;
    addr.sin_family=AF_INET;
    addr.sin_port=htons(9999);
    addr.sin_addr.s_addr=INADDR_ANY;
    //2.绑定
    int ret=bind(fd,(struct sockaddr *)&addr,sizeof(addr));
    if(ret==-1){
        perror("bind");
        exit(-1);
    }

    //3.通信
    while(1){
        char recvbuf[128];
        char ipbuf[16];
        struct sockaddr_in cliaddr;
        int len=sizeof(cliaddr);
        //接收数据
        int num=recvfrom(fd,recvbuf,sizeof(recvbuf),0,(struct sockaddr *)&cliaddr,&len);
        printf("client IP:%s,Port:%d\n",
            inet_ntop(AF_INET,&cliaddr.sin_addr.s_addr,ipbuf,sizeof(ipbuf)),
            ntohs(cliaddr.sin_port));
        printf("client say:%s\n",recvbuf);

        //发送数据
        sendto(fd,recvbuf,strlen(recvbuf)+1,0,(struct sockaddr *)&cliaddr,sizeof(cliaddr));

    }
    close(fd);
    return 0;
}

client.c

cpp 复制代码
#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
int main(){

    //1.创建一个通信的socket
    int fd=socket(PF_INET,SOCK_DGRAM,0);
    if(fd==-1){
        perror("socket");
        exit(-1);
    }

    //服务器的地址信息
    struct sockaddr_in saddr;
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(9999);
    inet_pton(AF_INET,"127.0.0.1",&saddr.sin_addr.s_addr);

    int num=0;
    //3.通信
    while(1){
        
        char sendBuf[128];
        sprintf(sendBuf,"hello,i am client%d\n",num++);
        //发送数据
        sendto(fd,sendBuf,strlen(sendBuf)+1,0,(struct sockaddr *)&saddr,sizeof(saddr));
        //接收数据
        int num=recvfrom(fd,sendBuf,sizeof(sendBuf),0,NULL,NULL);

        printf("server say:%s\n",sendBuf);
        sleep(1);

        

    }
    close(fd);
    return 0;
}

广播

向子网中多台计算机发送消息,只能向局域网发送。

每个广播消息都包含一个特殊的IP地址,这个IP中子网内主机标志部分的二进制全部为1。

192.168.10.最后一位255可以发给所有人

客户端需要绑定服务器广播使用的端口

客户端从部分数据才开始接收

client.c

cpp 复制代码
#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
int main(){

    //1.创建一个通信的socket
    int fd=socket(PF_INET,SOCK_DGRAM,0);
    if(fd==-1){
        perror("socket");
        exit(-1);
    }

    //客户端绑定本地的IP和端口
    struct sockaddr_in addr;
    addr.sin_family=AF_INET;
    addr.sin_port=htons(9999);
    addr.sin_addr.s_addr=INADDR_ANY;

    int ret=bind(fd,(struct sockaddr *)&addr,sizeof(addr));
    if(ret==-1){
        perror("bind");
        exit(-1);
    }

    int num=0;
    //3.通信
    while(1){
        
        char buf[128];
        //接收数据
        int num=recvfrom(fd,buf,sizeof(buf),0,NULL,NULL);

        printf("server say:%s\n",buf);
        sleep(1);

        

    }
    close(fd);
    return 0;
}

server.c

cpp 复制代码
#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
int main(){

    //1.创建一个通信的socket
    int fd=socket(PF_INET,SOCK_DGRAM,0);
    if(fd==-1){
        perror("socket");
        exit(-1);
    }

    //2.设置广播属性
    int op=1;
    setsockopt(fd,SOL_SOCKET,SO_BROADCAST,&op,sizeof(op));
    //3.创建一个广播的地址
    struct sockaddr_in cliaddr;
    cliaddr.sin_family=AF_INET;
    cliaddr.sin_port=htons(9999);
    inet_pton(AF_INET,"192.168.227.255",&cliaddr.sin_addr.s_addr);
    
    //3.通信
    int num=0;
    while(1){

        char sendBuf[128];
        sprintf(sendBuf,"hello,client...%d\n",num++);

        //发送数据
        sendto(fd,sendBuf,strlen(sendBuf)+1,0,(struct sockaddr *)&cliaddr,sizeof(cliaddr));
        printf("广播的数据:%s\n",sendBuf);
        sleep(1);

    }
    close(fd);
    return 0;
}

组播

组播既可以用于局域网,也可以用于广域网

客户端需要加入多播组,才能接收到多播的数据

client.c

cpp 复制代码
#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
int main(){

    //1.创建一个通信的socket
    int fd=socket(PF_INET,SOCK_DGRAM,0);
    if(fd==-1){
        perror("socket");
        exit(-1);
    }

    //客户端绑定本地的IP和端口
    struct sockaddr_in addr;
    addr.sin_family=AF_INET;
    addr.sin_port=htons(9999);
    addr.sin_addr.s_addr=INADDR_ANY;

    int ret=bind(fd,(struct sockaddr *)&addr,sizeof(addr));
    if(ret==-1){
        perror("bind");
        exit(-1);
    }

    struct ip_mreq op;
    inet_pton(AF_INET,"239.0.0.10",&op.imr_multiaddr.s_addr);
    op.imr_interface.s_addr=INADDR_ANY;
    //加入到多播组
    setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&op,sizeof(op));

    
    int num=0;
    //3.通信
    while(1){
        
        char buf[128];
        //接收数据
        int num=recvfrom(fd,buf,sizeof(buf),0,NULL,NULL);

        printf("server say:%s\n",buf);
        sleep(1);

        

    }
    close(fd);
    return 0;
}

server.c

cpp 复制代码
#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
int main(){

    //1.创建一个通信的socket
    int fd=socket(PF_INET,SOCK_DGRAM,0);
    if(fd==-1){
        perror("socket");
        exit(-1);
    }

    //2.设置多播属性,设置外出接口
    struct in_addr imr_multiaddr;
    //初始化多播地址
    inet_pton(AF_INET,"239.0.0.10",&imr_multiaddr.s_addr);
    setsockopt(fd,IPPROTO_IP,IP_MULTICAST_IF,&imr_multiaddr,sizeof(imr_multiaddr));
    //3.初始化客户端的地址信息
    struct sockaddr_in cliaddr;
    cliaddr.sin_family=AF_INET;
    cliaddr.sin_port=htons(9999);
    inet_pton(AF_INET,"239.0.0.10",&cliaddr.sin_addr.s_addr);
    
    //3.通信
    int num=0;
    while(1){

        char sendBuf[128];
        sprintf(sendBuf,"hello,client...%d\n",num++);

        //发送数据
        sendto(fd,sendBuf,strlen(sendBuf)+1,0,(struct sockaddr *)&cliaddr,sizeof(cliaddr));
        printf("组播的数据:%s\n",sendBuf);
        sleep(1);

    }
    close(fd);
    return 0;
}
相关推荐
见行AGV机器人1 小时前
AGV中工控机有什么用?
单片机·嵌入式硬件·非标定制agv·agv控制器
KWTXX1 小时前
TouchGFX 4.21.2 Designer与keil的联合使用【图形化】
单片机·嵌入式硬件
_Evan_Yao2 小时前
对话的边界:HTTP 的克制,SSE 的流淌,WebSocket 的自由
java·后端·websocket·网络协议·http
d111111111d2 小时前
STM32-UART抽象层封装
笔记·stm32·单片机·嵌入式硬件·学习
沃虎Chinty-032 小时前
工程师笔记:三大磁性元器件(共模电感/一体成型电感/CHIP LAN)选型要点与实战避坑
单片机·嵌入式硬件
小心我捶你啊3 小时前
VPS的主要用途,与其它方式的区别
服务器·网络协议·tcp/ip
恶魔泡泡糖6 小时前
stm32F103C8T6标准库反射(反射式红外)传感器触发蜂鸣器
stm32·单片机·嵌入式硬件
LCG元6 小时前
STM32实战:基于FreeRTOS的智能小车多任务调度(循迹+避障+通信)
stm32·单片机·嵌入式硬件
郝学胜-神的一滴7 小时前
epoll 边缘触发 vs 水平触发:从管道到套接字的深度实战
linux·服务器·开发语言·c++·网络协议·unix
2501_913061347 小时前
网络原理知识(6)
java·网络·网络协议·面试