NET组播和多播

1.组播

接收

#include <head.h>
#define ERR_MSG(msg) do{\
    perror(msg);\
    printf("__%d__\n",__LINE__);\
}while(0);

#define IP "224.1.2.23"

#define PORT 6557
int main(int argc,const char * argv[])
{
    printf("接收端\n");
    //创建报式套接字
    int sdf = socket(AF_INET,SOCK_DGRAM,0);
    if(sdf < 0){
        ERR_MSG("socket");
        return -1;
    }
    printf("报式套接字创建成功\n");
     
    struct ip_mreqn mq;
    mq.imr_multiaddr.s_addr = inet_addr(IP);           //组播IP的网络字节序
    mq.imr_address.s_addr = inet_addr("192.168.0.226");    //ifconfig的本机IP
    mq.imr_ifindex  = 3;                                    //网络设备索引号

    if((setsockopt(sdf, IPPROTO_IP, IP_ADD_MEMBERSHIP,&mq,sizeof(mq))) < 0 ){
        ERR_MSG("setsockopt");
        return -1;
    }
    printf("加入多播组成功: %s\n", IP);
    //一定需要绑定

       //发送之前的准备
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;                   //族连接在一起
    sin.sin_port =  htons(PORT);                //端口转换成点分十进制
    sin.sin_addr.s_addr = inet_addr(IP);        //地址转变成网络字节序
    socklen_t len = sizeof(sin);

    if((bind(sdf,(struct sockaddr*)&sin,len)) < 0){
        ERR_MSG("bind");
        return -1;
    }

    
    //保存的信息及长度
    struct sockaddr_in cin;
    socklen_t len1 = sizeof(cin);


    char buf[128] = "";
    char str[128] = "";
    int res = 0;
    while(1){
        memset(str,0,sizeof(str));
        printf("__%d__\n",__LINE__);
        res = recvfrom(sdf,str,sizeof(str),0,(struct sockaddr*)&cin,&len1);
        if(res < 0){
            ERR_MSG("recvfrom");
            return -1;
        }
        printf("read:-->[%s]:[%d]%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),str);     
    }

    close(sdf);
    return 0;
}

2).发送

#include <head.h>
#define ERR_MSG(msg) do{\
    perror(msg);\
    printf("__%d__\n",__LINE__);\
}while(0);

#define IP "224.1.2.23"

#define PORT 6557
int main(int argc,const char * argv[])
{
    printf("发送端\n");
    //创建报式套接字
    int sdf = socket(AF_INET,SOCK_DGRAM,0);
    if(sdf < 0){
        ERR_MSG("socket");
        return -1;
    }
    printf("报式套接字创建成功\n");

    

    //发送之前的准备
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;                   //族连接在一起
    sin.sin_port =  htons(PORT);                             //端口转换成点分十进制
    sin.sin_addr.s_addr = inet_addr(IP);        //地址转变成网络字节序
    
    socklen_t len = sizeof(sin);
    
    struct sockaddr_in cin;
    socklen_t len1 = sizeof(cin);

    char buf[128] = "";
    char str[128] = "";
    int res = 0;
    while(1){

        memset(buf,0,sizeof(buf));
        printf("请输入:\n");
        scanf("%s",buf);
        res = sendto(sdf,buf,sizeof(buf),0,(struct sockaddr*)&sin,len);
        //res = sendto(sdf,buf,sizeof(buf),0,NULL,0);
        if(res < 0){
            ERR_MSG("sendto");
            return -1;
        }
         memset(str,0,sizeof(str));
        printf("__%d__\n",__LINE__);
        res = recvfrom(sdf,str,sizeof(str),0,(struct sockaddr*)&cin,&len1);
        if(res < 0){
            ERR_MSG("recvfrom");
            return -1;
        }
        printf("read:-->[%s]:[%d]%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),str);   

    
    }
    return 0;
}

2.广播 

服务器

#include <head.h>
#define ERR_MSG(msg) do{\
    perror(msg);\
    printf("__%d__\n",__LINE__);\
}while(0);

#define IP "192.168.74.255"

#define PORT 1562
int main(int argc,const char * argv[])
{
    //创建套接字
    printf("服务器\n");
    int sfd = socket(AF_INET,SOCK_DGRAM,0);
    if(sfd < 0){
        ERR_MSG("socket");
        return -1;
    }
    printf("套接字创建成功\n");

    //设置允许广播
    int brockcast = 1;
    if((setsockopt(sfd,SOL_SOCKET,SO_BROADCAST,&brockcast,sizeof(brockcast))) < 0){
        ERR_MSG("setsockopt");
        return -1;
    }

    //绑定bind
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;                 //族需要相同
    sin.sin_port = htons(PORT);              //端口转变成点分十进制
    sin.sin_addr.s_addr = inet_addr(IP);    //地址转成网络字节序
    socklen_t len = sizeof(sin);


   

    struct sockaddr_in cin;
    socklen_t len1 = sizeof(cin);
    char buf[128] = "";
    char str[128] = "";
    int res = 0; 
    while(1){
            //传递
        memset(str,0,sizeof(str));
        printf("请输入:\n");
        scanf("%s",str);
        res = sendto(sfd,str,sizeof(str),0,(struct sockaddr*)&sin,len);
        if(res < 0){
            ERR_MSG("sendto");
        }

    }
    return 0;
}

客户端

#include <head.h>
#include <head.h>
#define ERR_MSG(msg) do{\
    fprintf(stderr,"line: %d\n",__LINE__);\
    perror(msg);\
    return -1;\
}while(0);

#define IP "192.168.74.255"

#define PORT 1562

int main(int argc,const char * argv[])
{
    //创建报式套接字
    int sfd = socket(AF_INET,SOCK_DGRAM,0);
    if(sfd < 0){
        ERR_MSG("socket");
    }
    printf("sfd = %d\n",sfd);

    //设置允许广播
    int brockcast = 1;
    if((setsockopt(sfd,SOL_SOCKET,SO_BROADCAST,&brockcast,sizeof(brockcast))) < 0){
        ERR_MSG("setsockopt");
        return -1;
    }


    //填充地址信息结构体
    //真实的地址信息结构体根据地址组指定
    struct sockaddr_in sin;

    sin.sin_family = AF_INET;  //族必须是和sdf的族一致
    sin.sin_port = htons(PORT); //端口号
    sin.sin_addr.s_addr = inet_addr(IP); //IP地址
    socklen_t len1 = sizeof(sin);

    //创造一个新的接口
    struct sockaddr_in cin;
    socklen_t len = sizeof(cin);

    if((bind(sfd,(struct sockaddr*)&sin,len)) > 0 ){
        ERR_MSG("bind");
        return -1;
    }
    printf("绑定bind成功\n");


    int res = 0;
    char buf[128] = "";
    char str[128] = "";

    while(1){

        //接收
        memset(buf,0,sizeof(buf));
        res = recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&len1);
        if(res < 0){
            ERR_MSG("recvfrom");
        }
        printf("recvfrom :%s\n",buf);
        if( 0 == strcmp(str,"quit")){
            break;
        }
        printf("[%s : %d] : %s\n", \
        inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);
    }

    close(sfd);
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值