C++使用Poco库指定网卡去接收组播数据

  • 0x00

    1、以下代码封装了一个UDP接收组播数据的类,第一个构造函数 Poco::Net::DatagramSocket 类可以实现UDP单播数据的接收、发送以及往组播发送数据,第二个构造函数使用Poco::Net::MulticastSocket类去接收组播数据,UdpUnit类中成员函数Recv仅仅实现了组播数据的接收,可以改成使用 Poco::Net::DatagramSocket 去接收单播数据。

  • 0x01

    2、Poco::Net::MulticastSocket在使用 joinGroup 函数加入组播时,可以只填写第一个参数"组播地址",Poco中Net库可以为你选择默认网卡加入组播,如果需要指定网卡加入组播时则使用 Poco::Net::NetworkInterface 类去选择需要的网卡。

  • 0x02

#ifndef UDP_UNIT_H
#define UDP_UNIT_H#include <string>
#include <Poco/Net/Socket.h>
#include <Poco/Net/SocketAddress.h>
#include <Poco/Net/DatagramSocket.h>
#include <Poco/Net/MulticastSocket.h>
#include <Poco/Net/NetException.h>
#include <Poco/Net/NetworkInterface.h>#define RECV_BUFFER_SIZE 1024 * 1024 * 1class UdpUnit
{
public:UdpUnit(std::string const local_addr, int const local_port);UdpUnit(std::string const local_addr, std::string const multicast_addr, int const multicast_port);int Recv(std::string &recvMsg);int Recv(char *buffer, int bufferSize);int Send(const char *buffer, int bufferSize, const std::string remote_addr, const int remote_port);private:Poco::Net::SocketAddress m_localAddress;Poco::Net::DatagramSocket m_datagramSocket;Poco::Net::MulticastSocket m_multicastSocket;
};#endif

#include "udpUnit.h"UdpUnit::UdpUnit(std::string const local_addr, int const local_port) : m_localAddress(local_addr, local_port)
{// 单播数据try{m_datagramSocket.bind(m_localAddress, true);}catch (const Poco::Exception &ex){printf("Error: %s\n", ex.displayText().c_str());}
}UdpUnit::UdpUnit(std::string const local_addr, std::string const multicast_addr, int const multicast_port)
{// 组播数据try{m_multicastSocket.bind(Poco::Net::SocketAddress(multicast_port), true);// 指定网卡加入组播Poco::Net::IPAddress localAddr(local_addr);Poco::Net::NetworkInterface iInterface;iInterface.addAddress(localAddr);Poco::Net::IPAddress multicastAddr(multicast_addr);m_multicastSocket.joinGroup(multicastAddr, iInterface);}catch (const Poco::Exception &ex){printf("Error: %s\n", ex.displayText().c_str());}
}int UdpUnit::Recv(std::string &recvMsg)
{int bytesReceived = -1;try{char recvBuffer[RECV_BUFFER_SIZE];Poco::Net::SocketAddress otherAddr;bytesReceived = m_multicastSocket.receiveFrom(recvBuffer, RECV_BUFFER_SIZE, otherAddr);printf("Received from <%s:%d>\n", otherAddr.host().toString().c_str(), otherAddr.port());recvMsg.assign(recvBuffer, bytesReceived);}catch (const Poco::Exception &ex){printf("Exception: %s\n", ex.displayText().c_str());}return bytesReceived;
}int UdpUnit::Recv(char *buffer, int bufferSize)
{int bytesReceived = -1;try{Poco::Net::SocketAddress otherAddr;bytesReceived = m_multicastSocket.receiveFrom(buffer, bufferSize, otherAddr);printf("Received from <%s:%d>\n", otherAddr.host().toString().c_str(), otherAddr.port());}catch (const Poco::Exception &ex){printf("Exception: %s\n", ex.displayText().c_str());}return bytesReceived;
}int UdpUnit::Send(const char *buffer, int bufferSize, const std::string remote_addr, const int remote_port)
{Poco::Net::SocketAddress m_remoteAddress(remote_addr, remote_port);int bytesSend = m_datagramSocket.sendTo(buffer, bufferSize, m_remoteAddress);return bytesSend;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/30363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

minSdkVersion、targetSdkVersion、compileSdkVersion三者的作用解析

minSDK和targetSDK&#xff0c;这两者相当于一个区间。你能够用到targetSDK中最新的API和最酷的新功能&#xff0c;但又需要向后(向下)兼容到minSDK&#xff0c;保证这个区间内的设备都能够正常的执行你的APP。换句话说&#xff0c;想使用Android刚刚推出的新特性&#xff0c;但…

JAVA 注解搜索工具类与注解原理讲解(获取方法和类上所有的某个注解,父类继承的注解也支持获取)

文章目录 JAVA 注解搜索工具类与注解原理讲解&#xff08;获取方法和类上所有的某个注解&#xff0c;父类继承的注解也支持获取&#xff09;代码测试方法上加注解&#xff0c;类上不加类上加注解、方法上加注解 注解原理性能测试 JAVA 注解搜索工具类与注解原理讲解&#xff08…

音视频开发_SDL多线程

今天将向大家介绍一下SDL中的多线程的使用。通过下面对SDL 线程与锁相关的API介绍&#xff0c;你会发现&#xff0c;它与 Linux, Windows相关的API几乎是一模一样的。从这里可以推断出&#xff0c;其实SDL对于多线程的处理只是为大家提供了一套统一接口&#xff0c;并没有做其它…

汉化版PSAI全面测评,探索国产AI绘画软件的创新力量

引言 随着AI技术的飞速发展&#xff0c;图像处理和绘画领域迎来了新的变革。作为一名AIGC测评博主&#xff0c;今天我们测评的是一款国产AI绘画软件——StartAI&#xff0c;一句话总结&#xff1a;它不仅在技术上毫不逊色于国际大牌&#xff0c;更在用户体验和本地化服务上做到…

Python sorted()方法

sorted() 是Python中的一个内置函数&#xff0c;用于对可迭代对象进行排序。它返回一个新的已排序的列表&#xff0c;而不会修改原始的可迭代对象。sorted() 函数的基本语法如下&#xff1a; sorted(iterable, keyNone, reverseFalse)参数解释&#xff1a; iterable&#xff…

AI 克隆声音,只需 3 分钟(附最全教程)

作者&#xff1a;寒斜 继生成式文本大模型 Chatgpt&#xff0c;生成式图片 Stablediffusion 之后生成式语音 Text To Speech 在开源社区也出现了一匹黑马&#xff0c;就是 GPT-Sovits [ 1] 。 之所以说他是黑马&#xff0c;让人觉得惊艳&#xff0c;是因为在语音效果克隆上做…

github安全问题token和sshkeys

文章目录 sshkeys问题问题方法一:方法二:获取密钥添加密钥token问题问题:生成tokens设置tokenssshkeys问题 问题 当我们git clone代码时,会报如下错误,此时有2种解决方法。 git clone git@github.com:gjianw217/xboard-uboot.git Cloning into xboard-uboot... Permissio…

数据分析必备:一步步教你如何用matplotlib做数据可视化(6)

1、Matplotlib 网格 axes对象的grid()函数将图中网格的可见性设置为on或off。还可以显示网格的主要/次要(或两者)刻度。另外&#xff0c;可以在grid()函数中设置color&#xff0c;linestyle和linewidth属性。 参考以下示例代码 import matplotlib.pyplot as plt import numpy…

14K屏FPGA通过MIPI接口点亮

一、屏参数 屏分辨率为13320*5120&#xff0c;MIPI接口8 LANE。 二、驱动接口电路 屏偏置电压5.5V&#xff0c;逻辑供电1.8V。8 LANE MIPI&#xff0c;2 PORT。 三、MIPI DSI规范 DCS (Display Command Set)&#xff1a;DCS是一个标准化的命令集&#xff0c;用于命令模式的显…

微信公众号开发要点笔记

为了识别用户&#xff0c;每个用户针对每个公众号会产生一个安全的OpenID&#xff0c;如果需要在多公众号、移动应用之间做用户共通&#xff0c;则需前往微信开放平台&#xff0c;将这些公众号和应用绑定到一个开放平台账号下&#xff0c;绑定后&#xff0c;一个用户虽然对多个…

整理好了!2024年最常见 20 道设计模式面试题(五)

上一篇地址&#xff1a;整理好了&#xff01;2024年最常见 20 道设计模式面试题&#xff08;四&#xff09;-CSDN博客 九、什么是命令模式&#xff1f;它如何帮助实现解耦&#xff1f; 命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;它将一…

奇怪的bug

奇怪的bug 合集 1.不可见字符集问题 起因是在自己做小项目的时候&#xff0c;通过lombok的data注解&#xff0c;默认生成实体类的get set方法 但是在某个方法中获取一个属性值的时候显示找不到该属性值的get方法&#xff0c;具体直接贴图 我以为是lombok的配置问题&#xff0c…

ubuntu设置静态ip地址

首先&#xff0c;查看ip地址可以使用&#xff1a; ifconfig 例如&#xff0c;出现如下结果&#xff1a; 然后&#xff0c;需要查看本地的gateway以及dns&#xff0c;可以使用&#xff1a; nmcli device show例如&#xff1a; 接下来说明一下如何设置静态ip&#xff1a;

揭秘后勤报修管理系统:目的明确,功能设计模块助您轻松管理

在数字化、信息化飞速发展的今天&#xff0c;企业后勤报修也迎来了前所未有的变革。传统的报修方式&#xff0c;如电话报修、纸质报修单等&#xff0c;已逐渐无法满足现代企事业单位对高效、便捷、精准报修服务的需求。因此&#xff0c;后勤报修管理系统应运而生&#xff0c;后…

鸣人的影分身(DP)

在火影忍者的世界里&#xff0c;令敌人捉摸不透是非常关键的。 我们的主角漩涡鸣人所拥有的一个招数——多重影分身之术——就是一个很好的例子。 影分身是由鸣人身体的查克拉能量制造的&#xff0c;使用的查克拉越多&#xff0c;制造出的影分身越强。 针对不同的作战情况&a…

C#友元函数与友元类

在C#中&#xff0c;并没有像C那样的友元函数和友元类的直接语法支持。C#中的访问控制是通过public、private、protected等访问修饰符来实现的&#xff0c;而不是通过友元的概念。 友元函数与友元类的概念 在C中&#xff0c;友元函数和友元类允许一个类或者函数访问另一个类的…

PHP转Go系列 | 变量常量的使用姿势

大家好&#xff0c;我是码农先森。 变量 在 PHP 语言中&#xff0c;初始化变量虽然只有一行&#xff0c;其实包含了两步&#xff0c;一是声明变量&#xff0c;二是赋值给变量&#xff0c;同一个变量可以任意再赋值任何类型的数据。 <?php// 初始化变量 $name "man…

Z世代职场价值观的重塑:从“班味”心态到个人成长的追求

近日&#xff0c;社交平台Soul APP联合上海市精神卫生中心&#xff08;俗称“宛平南路600号”&#xff09;发布《2024年Z世代职场心理健康报告》&#xff08;下称“报告”&#xff09;&#xff0c;发现今天的年轻人正以其独特的价值观和行为模式&#xff0c;重新定义成功与成就…

java 带有返回值的异步处理

1、先创建一个线程池 // 创建一个固定大小的线程池ExecutorService executor Executors.newFixedThreadPool(5); 2、创建一个异步现成执行你所需要执行的业务 CompletableFuture<String> future CompletableFuture.supplyAsync(() -> {System.out.println(Thread.c…

118.网络游戏逆向分析与漏洞攻防-邮件系统数据分析-邮件管理的界面与功能设计

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…