当前位置: 首页 > backend >正文

Poco C++全面开发指南:网络应用开发

UDP接收器

项目结构

poco_demo/
├── CMakeLists.txt
├── src/
│   ├── main.cpp
│   └── Receiver.cpp
└── include/└── Receiver.h

创建 Receiver.h

#pragma once#include <Poco/Net/DatagramSocket.h>
#include <Poco/Net/SocketAddress.h>#include <thread>class Receiver {
public:Receiver();~Receiver();bool start(const Poco::Net::SocketAddress& sa);void stop();Poco::UInt16 port() const;Poco::Net::SocketAddress address() const;protected:void run();void processMessage(char* buffer, int length, const Poco::Net::SocketAddress& sender);private:static constexpr size_t kMaxPacketLen = 256;Poco::Net::DatagramSocket m_socket;std::thread m_thread;std::atomic<bool> m_stopped;
};

创建 Receiver.cpp

 #include <Poco/Net/SocketAddress.h>
#include <Poco/Timespan.h>#include <iostream>
#include <random>
#include <thread>#include "Receiver.h"Receiver::Receiver() : m_stopped(true) {}Receiver::~Receiver() { stop(); }bool Receiver::start(const Poco::Net::SocketAddress& sa) {try {m_socket.bind(sa, true);std::cout << "binding on " << m_socket.address().toString() << std::endl;} catch (Poco::Exception& ex) {std::cerr << "bind: " << ex.displayText() << std::endl;return false;}m_stopped = false;m_thread = std::thread(&Receiver::run, this);return true;
}void Receiver::stop() {if (!m_stopped) {m_stopped = true;if (m_thread.joinable()) {m_thread.join();}}
}Poco::UInt16 Receiver::port() const { return m_socket.address().port(); }Poco::Net::SocketAddress Receiver::address() const { return m_socket.address(); }void Receiver::run() {Poco::Timespan span(250000);while (!m_stopped) {try {if (m_socket.poll(span, Poco::Net::Socket::SELECT_READ)) {char buffer[kMaxPacketLen];Poco::Net::SocketAddress sender;int readBytes = m_socket.receiveFrom(buffer, sizeof(buffer), sender);if (readBytes > 0) {processMessage(buffer, readBytes, sender);}}} catch (Poco::Exception& ex) {std::cerr << "recv: " << ex.displayText() << std::endl;}}
}void Receiver::processMessage(char* buffer, int length, const Poco::Net::SocketAddress& sender) {std::cout << "message " << std::string(buffer, length) << std::endl;return;
}

修改 CMakeLists.txt

cmake_minimum_required(VERSION 3.15)
project(poco_demo)# Find the Poco library
find_package(Poco COMPONENTS Net Foundation REQUIRED)# 包含头文件目录
include_directories(include)# 添加所有源文件
add_executable(poco_demosrc/main.cppsrc/Receiver.cpp 
)# 链接 Poco 库
target_link_libraries(poco_demoPoco::NetPoco::Foundation
)

创建main.cpp

#include <iostream>#include "Receiver.h"int main() {Receiver receiver;Poco::Net::SocketAddress address("localhost", 12345);if (receiver.start(address)) {std::cout << "Receiver started on " << address.toString() << std::endl;} else {std::cerr << "Failed to start receiver" << std::endl;return 1;}char ch;bool keepLooping = true;while (keepLooping) {std::cout << "Please enter a character (q to quit): ";ch = std::cin.get();if (ch == 'q') {// 如果输入字符为 'q',则退出循环keepLooping = false;} else {std::cout << "You entered: " << ch << std::endl;}// 清空输入缓冲区,避免多余的输入影响下一次循环std::cin.ignore();}receiver.stop();return 0;
}

TCP 回显服务器

项目结构

poco_net_example/
├── CMakeLists.txt
└── src/└── main.cpp

创建CMakeLists.txt

cmake_minimum_required(VERSION 3.12)
project(EchoServer)# 查找 Poco 库
find_package(Poco COMPONENTS Net Foundation REQUIRED)# 创建可执行文件
add_executable(EchoServersrc/main.cpp
)# 链接 Poco 库
target_link_libraries(EchoServerPoco::NetPoco::Foundation
)

创建main.cpp

#include <Poco/Net/TCPServer.h>
#include <Poco/Net/TCPServerConnection.h>
#include <Poco/Net/TCPServerConnectionFactory.h>
#include <Poco/Net/StreamSocket.h>
#include <Poco/Net/ServerSocket.h>
#include <Poco/Logger.h>
#include <Poco/AutoPtr.h>
#include <iostream>using namespace Poco::Net;
using namespace Poco;// 自定义连接处理类
class EchoConnection : public TCPServerConnection {
public:EchoConnection(const StreamSocket& socket) : TCPServerConnection(socket) {}void run() override {StreamSocket& socket = this->socket();try {char buffer[256];int n = socket.receiveBytes(buffer, sizeof(buffer));while (n > 0) {socket.sendBytes(buffer, n);n = socket.receiveBytes(buffer, sizeof(buffer));}} catch (Exception& exc) {std::cerr << "Error: " << exc.displayText() << std::endl;}}
};// 连接工厂
class EchoConnectionFactory : public TCPServerConnectionFactory {
public:TCPServerConnection* createConnection(const StreamSocket& socket) override {return new EchoConnection(socket);}
};int main() {try {// 创建服务器套接字(端口 12345)ServerSocket serverSocket(12345);// 配置服务器参数TCPServerParams::Ptr params = new TCPServerParams;params->setMaxThreads(4);params->setMaxQueued(100);params->setThreadIdleTime(100);// 创建 TCP 服务器TCPServer server(new EchoConnectionFactory, serverSocket, params);// 启动服务器server.start();std::cout << "Echo server started on port 12345..." << std::endl;// 保持服务器运行while (true) {Thread::sleep(1000);}server.stop();} catch (Poco::Exception& exc) {std::cerr << "Server exception: " << exc.displayText() << std::endl;return 1;}return 0;
}
http://www.xdnf.cn/news/3215.html

相关文章:

  • 综合开发-手机APP远程控制PLC1500柱灯的亮灭
  • 嵌入式开发高频面试题全解析:从基础编程到内存操作核心知识点实战
  • 基于UNet算法的农业遥感图像语义分割——补充版
  • Mysql数据库高可用解决方案-Mysql Router
  • 智能参谋部系统架构和业务场景功能实现
  • MCP Server 的 Stdio 与 SSE:两种通信方式的本质差异与技术选型指南
  • leetcode42-接雨水
  • OCR身份证识别(正反面)_个人证照OCR识别_开放API接口使用指南
  • iVX:数字化转型全场景技术革新与生态构建实践
  • 大连理工大学选修课——机器学习笔记(6):决策树
  • JCRQ1河马算法+消融实验!HO-CNN-LSTM-Attention系列四模型多变量时序预测,作者:机器学习之心
  • Linux架构篇、第1章_01架构的介绍HTTP HTTPS 协议全面解析
  • 【Axure教程】增删改饼图
  • PostgreSQL 中 VACUUM FULL 对索引的影响
  • 【TUST“码蹄杯”编程之星】4.30 每日一题
  • 抓取工具Charles配置教程(mac电脑+ios手机)
  • 算法四 习题 1.3
  • Vue 项目中运行 `npm run dev` 时发生的过程
  • 代码随想录算法训练营Day39
  • 数据科学与计算
  • Ecology中拦截jquery.ajax请求接口后的数据
  • 【Linux更新openSSH服务】
  • GNU gettext 快速上手
  • 论文公式根据章节自动编号教程
  • DeepSeek-Prover-V2-671B 简介、下载、体验、微调、数据集:专为数学定理自动证明设计的超大垂直领域语言模型(在线体验地址)
  • 涨薪技术|0到1学会性能测试第42课-apache监控与调优
  • 应对过度处方挑战:为药物推荐任务微调大语言模型(Xiangnan He)
  • K8S - HPA + 探针实战 - 实现弹性扩缩与自愈
  • 详解 MyBatis-Plus 框架中 QueryWrapper 类
  • Compose笔记(二十一)--AnimationVisibility