c++ 网络编程udp协议 poco模块

官网资料(需要梯子):https://pocoproject.org/slides/200-Network.pdf
1、poco是在原生socket之上的封装,底层还是socket,性能低于socket,安全性和实用性高于socket,即使用简便,接口简单
2、udp协议是,接收端没有及时接收或者没有接收到这个数据,数据会丢失
3、很多案例,包括官网给出的案例,端口都是514,这个端口发送是没什么限制,但是接收会出现,I/O error,解决这个问题,要么换端口,要么执行加管理员权限。
原因:

在计算机网络中,端口514是专门保留给 syslog 服务的标准端口。虽然这个端口通常是为系统日志守护进程保留的,但它不是严格保留的,这意味着应用程序也可以使用它发送UDP数据包。然而,这个端口在许多系统中需要超级用户权限才能绑定并接收数据包。因此,发送UDP数据包到端口514通常不会有权限问题,但接收数据包时会因为缺少权限而失败。下面是关于为什么你可以发送UDP数据包到端口514,而接收会遇到I/O错误的详细解释:发送UDP数据包到端口514
发送数据包到一个端口并不需要对该端口的特殊权限。你只需要有权限打开一个任意的UDP套接字,并发送数据包到目的IP和端口。因此,在发送数据包到端口514时不会遇到权限问题。接收UDP数据包在端口514
接收数据包需要将本地UDP套接字绑定到指定的端口。在Linux系统中,绑定到端口号小于1024的端口(也称为系统端口或保留端口)通常需要超级用户权限。端口514是一个保留端口,所以非超级用户尝试绑定到该端口时会失败,通常会抛出一个I/O错误

环境安装

sudo apt-get install libpoco-dev

使用示例,官网示例需要修改下端口:
udp发送

#include "Poco/Net/DatagramSocket.h"
#include "Poco/Net/SocketAddress.h"
#include "Poco/Timestamp.h"
#include "Poco/DateTimeFormatter.h"
int main(int argc, char **argv)
{Poco::Net::SocketAddress sa("localhost", 1101);Poco::Net::DatagramSocket dgs;dgs.connect(sa);Poco::Timestamp now;std::string msg = Poco::DateTimeFormatter::format(now,"<14>%w %f %H:%M:%S Hello, world!");dgs.sendBytes(msg.data(), msg.size());return 0;
}

udp接收

#include "Poco/Net/DatagramSocket.h"
#include "Poco/Net/SocketAddress.h"
#include <iostream>
int main(int argc, char **argv)
{// Poco::Net::SocketAddress sa(Poco::Net::IPAddress(), 514);Poco::Net::SocketAddress sa("localhost", 1101);Poco::Net::DatagramSocket dgs(sa);char buffer[1024];for (;;){Poco::Net::SocketAddress sender;int n = dgs.receiveFrom(buffer, sizeof(buffer) - 1, sender);buffer[n] = '\0';std::cout << sender.toString() << ": " << buffer << std::endl;}return 0;
}

编译

g++ test1.cpp -lPocoNet -lPocoFoundation -o send
g++ test2.cpp -lPocoNet -lPocoFoundation -o receiv

组播发送示例一:

#include "Poco/Net/SocketAddress.h"
#include "Poco/Net/MulticastSocket.h"
#include "Poco/DateTimeFormatter.h"
#include <iostream>
#include <cstring>
int main(int argc, char *argv[])
{try{Poco::Net::SocketAddress address("239.255.255.250", 1902);Poco::Net::MulticastSocket socket(Poco::Net::SocketAddress(Poco::Net::IPAddress(), address.port()));// to receive any data you must joinsocket.joinGroup(address.host());Poco::Net::SocketAddress sender;char buffer[512] = ""; // 字符串最好也要初始化,否则接收buffer,后会出现多余字符Poco::Timestamp now;std::string msg = Poco::DateTimeFormatter::format(now,"%Y-%m-%d %H:%M:%S.%i send: Hello, world!");socket.sendTo(msg.data(), msg.size(), address); // 想要做监听程序:注释掉sendToint n = socket.receiveFrom(buffer, sizeof(buffer), sender);std::cout << "Received message: " << buffer << " from " << sender.toString() << std::endl;}catch (Poco::Exception &e){std::cerr << "Exception: " << e.displayText() << std::endl;return 1;}return 0;
}

组播模式注意事项:
1、“239.255.255.250”, 1902组合起来,类似于唯一标签,抓包可抓取"239.255.255.250"
2、1902为端口号,一定要检测一下,该端口号下,是否干扰包出现,出现即换端口
3、组播Poco::Net::SocketAddress address(“239.255.255.250”, 1902);需要在同网段唯一标签一致,才能通信
4、sender.toString()可查看来自哪个IP发送的信息

组播接收

#include <Poco/Net/DatagramSocket.h>
#include <Poco/Net/SocketAddress.h>
#include <Poco/Net/MulticastSocket.h>
#include <Poco/Net/NetworkInterface.h>
#include <iostream>
#include <vector>int main() {try {// 设置组播地址和端口Poco::Net::SocketAddress multicastAddress("239.1.1.5", 9200);// 创建DatagramSocketPoco::Net::MulticastSocket socket(Poco::Net::IPAddress::IPv4);socket.bind(Poco::Net::SocketAddress(Poco::Net::IPAddress(), multicastAddress.port()), true);// 加入组播组Poco::Net::NetworkInterface iface = Poco::Net::NetworkInterface::forName("eth0.10"); // 使用实际的网络接口socket.joinGroup(multicastAddress.host(), iface);std::vector<char> buffer(1024);std::cout << "Listening for multicast messages on " << multicastAddress.toString() << " ..." << std::endl;while (true) {Poco::Net::SocketAddress sender;int n = socket.receiveFrom(&buffer[0], buffer.size(), sender);if (n > 0) {std::string message(buffer.begin(), buffer.begin() + n);std::cout << "Received message from " << sender.toString() << ": " << message << std::endl;}}// 离开组播组socket.leaveGroup(multicastAddress.host(), iface);} catch (Poco::Exception& ex) {std::cerr << "Poco Exception: " << ex.displayText() << std::endl;} catch (std::exception& ex) {std::cerr << "Standard Exception: " << ex.what() << std::endl;} catch (...) {std::cerr << "Unknown Exception!" << std::endl;}return 0;
}

附录: 时间模块

Poco::Timestamp now;
std::string msg = Poco::DateTimeFormatter::format(now, "%Y-%m-%d %H:%M:%S.%i ");
Poco::Int64 ms_msg = now.epochMicroseconds() / 1000;// 数字转化为固定长度字符
Poco::Timestamp now;
// std::string msg = Poco::DateTimeFormatter::format(now, "%Y-%m-%d %H:%M:%S.%i ");
Poco::Int64 ms_msg= now.epochMicroseconds() / 1000;
std::string msg = std::to_string(ms_msg);
std::stringstream ss;
ss << std::setw(13) << std::setfill('0') << msg;  // 注意计算ms转化为字符串的长度

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

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

相关文章

办公灯多普勒雷达模组感应开关,飞睿智能24G毫米波雷达超低功耗uA级,节能LED灯新搭档

在科技日新月异的今天&#xff0c;节能、环保已经成为我们生活和工作中不可或缺的一部分。作为新时代的办公人&#xff0c;我们不仅要追求高效的工作方式&#xff0c;更要关注我们所使用的设备是否足够环保、节能。今天&#xff0c;我们就来聊聊一个令人兴奋的创新——飞睿智能…

COMX-P2020、COMX-P1022 vxWorks系统开发主机

提供vxworks6.9开发环境和BSP源码&#xff0c;具有千兆以太网&#xff0c;调试串口&#xff0c;4个PCIe插槽&#xff0c;支持PCIe 1.0a和msi中断&#xff0c;底板板载一块Xilinx CPLD XC95144&#xff0c;提供ISE14.7安装包和verilog源码。可定制开发基于PCIe接口和fpga的拓展接…

多语言环境大师:在PyCharm中管理多个Python解释器

多语言环境大师&#xff1a;在PyCharm中管理多个Python解释器 PyCharm作为业界领先的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;支持多种Python解释器的配置和管理&#xff0c;使得开发者可以针对不同项目使用不同的Python环境。本文将详细介绍如何在PyCharm…

如何30分钟下载完368G的Android系统源码?

如何30分钟下载完368G的Android系统源码&#xff1f; Android系统开发的一个痛点问题就是Android系统源码庞大&#xff0c;小则100G,大则&#xff0c;三四百G。如标题所言&#xff0c;本文介绍通过局域网高速网速下载源码的方法。 制作源码mirror 从源码git服务器A&#xff0c…

推荐系统:从协同过滤到深度学习

目录 一、协同过滤&#xff08;Collaborative Filtering, CF&#xff09;1. 基于用户的协同过滤2. 基于物品的协同过滤 二、深度学习在推荐系统中的应用1. 深度学习模型的优势2. 深度学习在推荐系统中的应用实例 三、总结与展望 推荐系统是现代信息处理和传播中不可或缺的技术&…

【话题】破茧而出:打破AI“信息茧房”,捍卫信息自由与多样性

目录 AI发展下的伦理挑战&#xff0c;应当如何应对&#xff1f; 方向一&#xff1a;构建可靠的AI隐私保护机制 方向二&#xff1a;确保AI算法的公正性和透明度 方向三&#xff1a;管控深度伪造技术 AI发展下的伦理挑战&#xff0c;应当如何应对&#xff1f; 在人工智能&…

Tita的OKR:高端制造行业的OKR案例

高端设备制造行业的发展趋势&#xff1a; 产业规模持续扩大&#xff1a;在高技术制造业方面&#xff0c;航空、航天器及设备制造业、电子工业专用设备制造等保持较快增长。新能源汽车保持产销双增&#xff0c;新材料新产品生产也高速增长。 标志性装备不断突破&#xff1a;例如…

数据结构第27节 优先队列

优先队列&#xff08;Priority Queue&#xff09;是在计算机科学中一种非常有用的抽象数据类型&#xff0c;它与标准队列的主要区别在于元素的出队顺序不是先进先出&#xff08;FIFO&#xff09;&#xff0c;而是基于每个元素的优先级。具有较高优先级的元素会比低优先级的元素…

论文写作经验-摘要1

小王搬运工 时序课堂 2024年07月15日 13:10 新疆 本人菜鸡一名&#xff0c;最近几篇论文实验跑的比较顺利&#xff0c;结果也很不错&#xff0c;奈何于自己写作能力巨差&#xff0c;导致文章屡屡被拒。当前正在跟一位非常牛的老师学习写作技巧&#xff0c;我将一些心得体会和技…

MySQL教程 | 笔记 (包含数据库、表设计,数据库的增删改查操作;数据库优化等知识点)

SQL简介 一门操作关系型数据库的编程语言&#xff0c;定义操作所有关系型数据库的统一标准 通用语法&#xff1a; 可以单行或者多行书写&#xff0c;以分号结尾&#xff1b; 可以使用空格 / SQL语句可以使用空格/缩进来增强语句的可读性。 MySQL数据库的SOL语句不区分大小…

Flink Window 窗口【更新中】

Flink Window 窗口 在Flink流式计算中&#xff0c;最重要的转换就是窗口转换Window&#xff0c;在DataStream转换图中&#xff0c;可以发现处处都可以对DataStream进行窗口Window计算。 窗口&#xff08;window&#xff09;就是从 Streaming 到 Batch 的一个桥梁。窗口将无界流…

C#+GDAL影像处理笔记09:创建多边形、多部件图形、合并相邻的多边形

使用GDAL创建多边形、多部件要素、相邻面合并、以及shape文件创建的完整过程 1. 创建一个多边形 多边形必须闭合 // 创建第一个多边形几何对象Geometry polygon1 = new Geometry(wkbGeometryType.wkbPolygon);Geometry ring1 = new Geometry(wkbGeometryType.wkbLinearRing);…

银河麒麟如何部署QtMqtt(入门案例教程)

QtMqtt是一个基于Qt的MQTT客户端库,提供了使用MQTT协议与 MQTT broker 进行通信的功能。silver-linix是一个基于Linux的操作系统,用于嵌入式系统和物联网设备。下面将教您如何在silver-linix上部署QtMqtt。 1. 安装QtMqtt 1.1 安装QtMqtt依赖项 QtMqtt依赖于Qt和QtNetwork…

跨越空间的编码:在PyCharm中高效使用远程解释器

跨越空间的编码&#xff1a;在PyCharm中高效使用远程解释器 PyCharm的强大功能之一是支持远程解释器&#xff0c;这使得开发者能够在远程服务器或虚拟机上运行、调试代码&#xff0c;享受本地开发环境的便利。本文将详细介绍如何在PyCharm中配置和使用远程解释器&#xff0c;包…

系统架构师考点--软件工程(上)

大家好。今天我来总结一下软件工程的相关考点。这部分是考试的重点。在上午场客观题、下午场案例题以及下午场论文都有可能考到&#xff0c;在上午场客观题中大约占12-15分左右。 一、软件工程概述 软件开发生命周期 软件定义时期&#xff1a;包括可行性研究和详细需求分析过…

构建革新:在Gradle中打造自定义插件的终极指南

构建革新&#xff1a;在Gradle中打造自定义插件的终极指南 在构建自动化的征途上&#xff0c;Gradle以其灵活性和强大的扩展能力成为开发者的得力助手。自定义插件是Gradle生态中的一颗璀璨明珠&#xff0c;它允许开发者根据特定需求扩展Gradle的功能。本文将带你走进Gradle自…

uniapp打包成Android时,使用uni.chooseLocation在App端显示的地址列表是空白?一直转圈的解决办法

问题描述&#xff1a; uniapp打包后的测试版app在ios里可以显示高德地图的定位列表&#xff0c;但是安卓手机却不显示定位列表&#xff0c;一直在转圈圈&#xff0c;怎么回事&#xff1f;之前的功能在正式版都能用&#xff0c;真机运行也能用&#xff0c;为什么测试版的安卓手…

ADC性能规格--动态性能

所有真正的ADC都有额外的噪声源和失真过程&#xff0c;会降低性能。 动态性能规范报告了ADC动态行为中的这些缺陷&#xff0c;包括总谐波失真&#xff08;THD&#xff09;、信噪比加失真&#xff08;SND&#xff09;、信号噪声比&#xff08;SNR&#xff09;和无杂散动态范围&a…

【MySQL】7.MySQL 的内置函数

MySQL的内置函数 一.日期函数二.字符串函数三.数学函数四.其它函数 一.日期函数 函数名称说明current_date()当前日期current_time()当前时间current_timestamp当前时间戳(日期时间)date(datetime)截取 datetime 的日期部分date_add(date, interval d_value_type)给 date 添加…

Study--Oracle-07-ASM自动存储管理(二)

一、ASM安装准备条件 1、ASM支持存储类型 本地祼设备(本地的磁盘和分区) 网络附加存储(NAS) 存储区域网络(SAN) 2、ASM使用本地裸设备,要点: 已经被挂载到操作系统上或者已经做了分区 映射裸设备为文件名 设置正确的权限(针对grid用户和asmadmin组,权限为660) 二、OR…