UDP通讯协议广播和组播实现

UDP 通讯协议广播

UDP广播发送端

#include "myhead.h"

int main(int argc,char **argv)
{
    int udpsock;
    int ret;
    char sbuf[100];
    //定义ipv4地址体变量存放需要绑定的ip和端口号
    struct sockaddr_in bindaddr;
    bzero(&bindaddr,sizeof(bindaddr));
    bindaddr.sin_family=AF_INET;
    bindaddr.sin_addr.s_addr=htonl(INADDR_ANY); //自动匹配发送端的ip
    bindaddr.sin_port=htons(20000); //发送端端口号
    
    //定义ipv4地址体变量目标主机的ip和端口号
    struct sockaddr_in otheraddr;
    bzero(&otheraddr,sizeof(otheraddr));
    otheraddr.sin_family=AF_INET;
    otheraddr.sin_addr.s_addr=inet_addr("192.168.22.255"); //我们课室局域网广播地址
    otheraddr.sin_port=htons(30000); //端口号
    
    //创建udp套接字
    udpsock=socket(AF_INET,SOCK_DGRAM,0);
    if(udpsock==-1)
    {
        perror("创建udp套接字失败!\n");
        return -1;
    }
    
    //取消端口绑定的限制
    int on=1;
    setsockopt(udpsock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
    
    //绑定
    ret=bind(udpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
    if(ret==-1)
    {
        perror("绑定ip端口失败了!\n");
        return -1;
    }
    
    //设置套接字的属性为可以广播
    setsockopt(udpsock,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
    
    //广播信息给我们课室所有的主机
    while(1)
    {
        bzero(sbuf,100);
        printf("请输入要广播发送的信息!\n");
        scanf("%s",sbuf);
        sendto(udpsock,sbuf,strlen(sbuf),0,(struct sockaddr *)&otheraddr,sizeof(otheraddr));
    }
    
    //关闭
    close(udpsock);
    return 0;
}

UDP广播接收端

#include "myhead.h"

int main(int argc,char **argv)
{
    int udpsock;
    int ret;
    char sbuf[100];
    //定义ipv4地址体变量存放需要绑定的ip和端口号
    struct sockaddr_in bindaddr;
    bzero(&bindaddr,sizeof(bindaddr));
    bindaddr.sin_family=AF_INET;
    bindaddr.sin_addr.s_addr=htonl(INADDR_ANY); //自动匹配接收端的ip
    bindaddr.sin_port=htons(30000); //接收端端口号
    
    //定义ipv4地址体变量目标主机的ip和端口号
    struct sockaddr_in otheraddr;
    bzero(&otheraddr,sizeof(otheraddr));
    int addrsize=sizeof(otheraddr);
    
    //创建udp套接字
    udpsock=socket(AF_INET,SOCK_DGRAM,0);
    if(udpsock==-1)
    {
        perror("创建udp套接字失败!\n");
        return -1;
    }
    
    //取消端口绑定的限制
    int on=1;
    setsockopt(udpsock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
    
    //绑定
    ret=bind(udpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
    if(ret==-1)
    {
        perror("绑定ip端口失败了!\n");
        return -1;
    }
    
    //接收广播信息
    while(1)
    {
        bzero(sbuf,100);
        recvfrom(udpsock,sbuf,100,0,(struct sockaddr *)&otheraddr,&addrsize);
        printf("ip地址是:%s 端口号是:%hu 广播发送过来的信息是:%s\n",inet_ntoa(otheraddr.sin_addr),ntohs(otheraddr.sin_port),sbuf);
    }
    
    //关闭
    close(udpsock);
    return 0;
}

UDP通讯协议组播

UDP组播发送端

#include "myhead.h"

int main(int argc,char **argv)
{
    int udpsock;
    int ret;
    char sbuf[100];
    //定义ipv4地址体变量存放需要绑定的ip和端口号
    struct sockaddr_in bindaddr;
    bzero(&bindaddr,sizeof(bindaddr));
    bindaddr.sin_family=AF_INET;
    bindaddr.sin_addr.s_addr=htonl(INADDR_ANY); //自动匹配发送端的ip
    bindaddr.sin_port=htons(20000); //发送端端口号
    
    //定义ipv4地址体变量目标主机的ip和端口号
    struct sockaddr_in otheraddr;
    bzero(&otheraddr,sizeof(otheraddr));
    otheraddr.sin_family=AF_INET;
    otheraddr.sin_addr.s_addr=inet_addr("225.168.22.7"); //我选定的组播组地址
    otheraddr.sin_port=htons(30000); //端口号
    
    //创建udp套接字
    udpsock=socket(AF_INET,SOCK_DGRAM,0);
    if(udpsock==-1)
    {
        perror("创建udp套接字失败!\n");
        return -1;
    }
    
    //取消端口绑定的限制
    int on=1;
    setsockopt(udpsock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
    
    //绑定
    ret=bind(udpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
    if(ret==-1)
    {
        perror("绑定ip端口失败了!\n");
        return -1;
    }
    
    //设置套接字的属性为可以广播
    setsockopt(udpsock,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
    
    //组播信息给加入到我指定的组播组里面的机器
    while(1)
    {
        bzero(sbuf,100);
        printf("请输入要组播发送的信息!\n");
        scanf("%s",sbuf);
        sendto(udpsock,sbuf,strlen(sbuf),0,(struct sockaddr *)&otheraddr,sizeof(otheraddr));
    }
    
    //关闭
    close(udpsock);
    return 0;
}

UDP组播接收端

#include "myhead.h"

int main(int argc,char **argv)
{
    int udpsock;
    int ret;
    char sbuf[100];
    //定义ipv4地址体变量存放需要绑定的ip和端口号
    struct sockaddr_in bindaddr;
    bzero(&bindaddr,sizeof(bindaddr));
    bindaddr.sin_family=AF_INET;
    bindaddr.sin_addr.s_addr=htonl(INADDR_ANY); //自动匹配接收端的ip
    bindaddr.sin_port=htons(30000); //接收端端口号
    
    //定义ipv4地址体变量目标主机的ip和端口号
    struct sockaddr_in otheraddr;
    bzero(&otheraddr,sizeof(otheraddr));
    int addrsize=sizeof(otheraddr);
    
    //创建udp套接字
    udpsock=socket(AF_INET,SOCK_DGRAM,0);
    if(udpsock==-1)
    {
        perror("创建udp套接字失败!\n");
        return -1;
    }
    
    //取消端口绑定的限制
    int on=1;
    setsockopt(udpsock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
    
    //绑定
    ret=bind(udpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
    if(ret==-1)
    {
        perror("绑定ip端口失败了!\n");
        return -1;
    }
    
    //加入到发送端指定的那个组播组里面
    struct ip_mreq mreq;  //定义结构体变量保存组播组信息
    bzero(&mreq, sizeof(mreq));
    mreq.imr_multiaddr.s_addr = inet_addr("225.168.22.7"); //  D类地址  
    mreq.imr_interface.s_addr = htonl(INADDR_ANY);  // 必须用这个宏定义
    setsockopt(udpsock, IPPROTO_IP, IP_ADD_MEMBERSHIP,&mreq, sizeof(mreq)); //把这个主机添加到组播组里面
    
    //接收组播信息
    while(1)
    {
        bzero(sbuf,100);
        recvfrom(udpsock,sbuf,100,0,(struct sockaddr *)&otheraddr,&addrsize);
        printf("ip地址是:%s 端口号是:%hu 组播发送过来的信息是:%s\n",inet_ntoa(otheraddr.sin_addr),ntohs(otheraddr.sin_port),sbuf);
    }
    
    //关闭
    close(udpsock);
    return 0;
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肖爱Kun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值