C/C++开发,udp组播通信实现(c++)

目录

一、udp通信

二、实现代码逻辑

        2.1 发送方

        2.2 接收方

三、完整源代码及测试配置


一、udp通信

        前几天需要做一个和第三方平台配套的单向通信,反向隔离的通信接口,原本确定是采用UDP组播方式实现,通信设备中间加正向网络隔离装置防止反通信。我想着赶紧先行测试验证一下,哪知我好不容易花了一个下午编译测试后,对接的厂家却反馈说不再使用udp通信,他们要用http方式,并不考虑两个系统通信隔离问题。我只能心里不爽,但谁让是我司求人配合呢,只好改用http实现,又赶了一个工作日把http开发接口开发出来。

      嗯,储备过的知识不能丢,放到CSDN上给予有需要的小伙伴也行。

       udp发送调用socket套接字实现很简单,无非就是调用sendto函数发送信息,调用recvfrom函数接收数据,其关键点就是接收方需要绑定组播地址和端口,相当于加入组播,才能接收到数据。另外需要明确两个概念,组播地址和本机地址,例如234.3.3.3和192.168.1.100.

二、实现代码逻辑

        以linux为例,展示其实现关键点

        2.1 发送方

        首先我们看下发送方:

      1)构造socket

       udp_socket = socket(AF_INET, SOCK_DGRAM, 0);

       //如果需要绑定,记得绑定本地地址

      2)指定发送的组播地址和端口

    struct sockaddr_in mcast_addr; 
    memset(&mcast_addr, 0, sizeof(mcast_addr));
    mcast_addr.sin_family = AF_INET;
    mcast_addr.sin_addr.s_addr = inet_addr(mcast_ip.c_str());
    mcast_addr.sin_port = htons(mcast_port); 

      3)发送组播数据

      //it为组播数据内容描述

       int n = sendto(udp_socket, it.c_str(), it.length(),0,(struct sockaddr*)&mcast_addr,sizeof(mcast_addr));

      4)关闭socket

       close(udp_socket);

        2.2 接收方

        下面看看接收方的实现

        1)同样是先构建socket

udp_socket = socket(AF_INET, SOCK_DGRAM, 0);

        2)绑定本机地址

   //
    struct sockaddr_in local_addr;
    memset(&local_addr, 0, sizeof(local_addr));
    local_addr.sin_family = AF_INET;
    local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    //local_addr.sin_addr.s_addr = inet_addr(local_ip.c_str());//指定发送的网口
    local_addr.sin_port = htons(mcast_port);
    //建立本地捆绑(主机地址/端口号)
    int err = -1;
    err = bind(udp_socket,(struct sockaddr*)&local_addr, sizeof(local_addr));

        3)加入组播,才能接收到组播信息
    struct ip_mreq mreq;
    mreq.imr_multiaddr.s_addr = inet_addr(mcast_ip.c_str());
    if(local_ip.empty()){
        mreq.imr_interface.s_addr = htonl(INADDR_ANY);                //任意接口接收组播信息
    }else{
        mreq.imr_interface.s_addr = inet_addr(local_ip.c_str());    //指定接口接收组播信息
    }

   err = setsockopt(udp_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));

        4)接收数据

   sockaddr_in srv_Addr;//用于存储发送方信息
   socklen_t addr_len = sizeof(srv_Addr);
   char *buff = new char[buf_size];

   memset(buff, 0, buf_size);
   n = recvfrom(udp_socket, buff, buf_size, 0,(struct sockaddr*)&srv_Addr,&addr_len);

        5)使用完后可以退出组播,关闭socket

    err = setsockopt(udp_socket, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq));
    close(udp_socket);

三、完整源代码及测试配置

        完整的udp实例可以去我的下载资源下载udp_test.zip

udp_test.zip_c++组播通信-网络基础代码类资源-CSDN下载

        该实例我采用的编译环境是centos7.3_x64/gcc4.8,win8_x64/vs2015,支持cmake配置

其中发送端仅实现linux,接收端实现linux/win

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

py_free-物联智能

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

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

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

打赏作者

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

抵扣说明:

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

余额充值