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;
}

你可能感兴趣的:(UDP通讯协议,UDP通信协议,UDP广播和组播)