【C++】POCO学习总结(九):网络

【C++】郭老二博文之:C++目录

1、Poco::Net::IPAddress IP地址

Poco::Net::IPAddress类存储IPv4或IPv6主机地址。
Poco::Net::IPAddress可以从字符串解析,也可以格式化为字符串。支持IPv4格式(d.d.d.d)和IPv6格式(x: x: x: x: x: x: x: x)。

常用函数:
是否包含通配符:isWildcard()
是否是广播地址:isBroadcast()
是否是回环地址:isLoopback()
是否是多播地址:isMulticast()

2、Poco::Net::SocketAddress 网络地址

Poco::Net::SocketAddress 是将 Poco::Net::IPAddress与端口号结合起来,从而标识IP网络连接的端点。
Poco::Net::SocketAddress支持值语义,但不支持比较。
Poco::Net::SocketAddress可以由IPAddress +端口号、字符串IP地址+端口号 或 以冒号分隔的IP地址和端口号的字符串创建。

3、Poco::Net::DNS 域名

Poco::Net::DNS类提供了一个域名系统的接口,将域名映射到IP地址,或者从IP地址映射到域名。

4、Poco::Net::HostEntry 主机信息

Poco::Net::HostEntry包含主机地址信息,包含主机名称、别名列表和IP地址列表。

示例:$ vi host.cpp

#include "Poco/Net/DNS.h"
#include <iostream>using Poco::Net::DNS;
using Poco::Net::IPAddress;
using Poco::Net::HostEntry;int main(int argc, char** argv)
{const HostEntry& entry = DNS::hostByName("www.baidu.com");std::cout << "Canonical Name: " << entry.name() << std::endl;const HostEntry::AliasList& aliases = entry.aliases();HostEntry::AliasList::const_iterator it = aliases.begin();for (; it != aliases.end(); ++it)std::cout << "Alias: " << *it << std::endl;const HostEntry::AddressList& addrs = entry.addresses();HostEntry::AddressList::const_iterator ita = addrs.begin();for (; ita != addrs.end(); ++ita)std::cout << "Address: " << ita->toString() << std::endl;return 0;
}

编译:

g++ host.cpp -I ~/git/poco/install/include -L ~/git/poco/install/lib -lPocoNet -std=c++11

输出:

Canonical Name: www.baidu.com
Address: 39.156.66.14
Address: 39.156.66.18
Address: 2409:8c00:6c21:104f:0:ff:b03f:3ae	
Address: 2409:8c00:6c21:1051:0:ff:b0af:279a

5、Poco::Net::Socket 套接字

Poco::Net::Socket是各种Socket的基类。

支持套接字常用接口:

  • select() and poll()
  • 设置和获取各种套接字选项(超时、缓冲区大小、重用地址标志等)
  • 获取套接字地址和对端地址
    在这里插入图片描述

6、Poco::Net::StreamSocket TCP客户端

Poco::Net::StreamSocket用于创建到服务器的TCP连接。
使用sendBytes()和receiveBytes()来发送和接收数据;
或者使用Poco::Net::SocketStream类,它为StreamSocket提供了一个I/O流接口。

示例:$ vi tcp.cpp

#include "Poco/Net/SocketAddress.h"
#include "Poco/Net/StreamSocket.h"
#include "Poco/Net/SocketStream.h"
#include "Poco/StreamCopier.h"
#include <iostream>int main(int argc, char** argv)
{Poco::Net::SocketAddress sa("www.appinf.com", 80);Poco::Net::StreamSocket socket(sa);Poco::Net::SocketStream str(socket);str << "GET / HTTP/1.1\r\n""Host: www.appinf.com\r\n""\r\n";str.flush();Poco::StreamCopier::copyStream(str, std::cout);return 0;
}

编译:

$ g++ tcp.cpp -I ~/git/poco/install/include -L ~/git/poco/install/lib -lPocoNet -lPocoFoundation

输出:

HTTP/1.1 301 Moved Permanently
Date: Sun, 03 Dec 2023 10:04:01 GMT
Server: Apache
Strict-Transport-Security: max-age=63072000; includeSubdomains;
X-Frame-Options: SAMEORIGIN
Location: https://www.appinf.com/
Content-Length: 295
Content-Type: text/html; charset=iso-8859-1<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="https://www.appinf.com/">here</a>.</p>
<hr>
<address>Apache Server at www.appinf.com Port 80</address>
</body></html>

7、Poco::Net::ServerSocket TCP服务端

Poco::Net::ServerSocket用于创建TCP服务器套接字。
Poco::Net::ServerSocket是较底层次的封装,在创建TCP服务器时,推荐使用Poco::Net::TCPServer或Reactor框架。

示例:

#include "Poco/Net/ServerSocket.h"
#include "Poco/Net/StreamSocket.h"
#include "Poco/Net/SocketStream.h"
#include "Poco/Net/SocketAddress.h"int main(int argc, char** argv)
{Poco::Net::ServerSocket srv(8080); for (;;){Poco::Net::StreamSocket ss = srv.acceptConnection();Poco::Net::SocketStream str(ss);str << "HTTP/1.0 200 OK\r\n""Content-Type: text/html\r\n""\r\n""<html><head><title>My 1st Web Server</title></head>""<body><h1>Hello, world!</h1></body></html>"<< std::flush;}return 0;
}

8、Poco::Net::DatagramSocket UDP报文

Poco::Net::DatagramSocket用于发送和接收UDP报文。
Poco::Net::DatagramSocket的子类Poco::Net::MulticastSocket允许发送组播数据报。
要接收组播消息,必须加入组播组,使用MulticastSocket::joinGroup()。

示例1:udp接收方
$ vi udp-recv.cpp

#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(), 5514);
Poco::Net::DatagramSocket dgs(sa, false);
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++ -o udp-recv udp-recv.cpp  -I ~/git/poco/install/include -L ~/git/poco/install/lib -lPocoNet -lPocoFoundation

示例2: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", 5514);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;
}

编译:

g++ -o udp-send udp-send.cpp  -I ~/git/poco/install/include -L ~/git/poco/install/lib -lPocoNet -lPocoFoundation

先运行接收方,再运行发送方,打印信息如下:

$ ./udp-recv 
127.0.0.1:41406: <14>Tue  5 13:07:54 Hello, world!
127.0.0.1:48117: <14>Tue  5 13:07:56 Hello, world!

9、Poco::Net::TCPServer TCP服务器框架

Poco::Net::TCPServer实现了一个多线程的TCP服务器。
1)ServerSocket
服务器使用一个ServerSocket来接受传入的连接。在将ServerSocket传递给TCPServer之前,必须将其置于侦听模式。

2)队列
服务器为进入的连接维护一个队列。
可变数量的工作线程从队列中获取连接并处理它们。工作线程的数量会根据队列中等待的连接数量自动调整。
可以限制队列中的连接数
TCPServer创建自己的线程,该线程接受连接并将它们放入队列。

3)连接 TCPServerConnection
TCPServer使用TCPServerConnection对象来处理连接。
可以使用工厂的方法创建TCPServerConnection,工厂对象需要传递给TCPServer的构造函数。

TCPServerConnection的子类必须run()方法。在run()方法中,可以处理连接后的逻辑。
当run()返回时,TCPServerConnection对象将被删除,连接将被关闭。

示例

#include "Poco/Net/TCPServer.h"
#include "Poco/Net/TCPServerConnection.h"
#include "Poco/Net/TCPServerConnectionFactory.h"
#include "Poco/Net/StreamSocket.h"
#include "Poco/NumberParser.h"
#include "Poco/Logger.h"
#include "Poco/Process.h"
#include "Poco/NamedEvent.h"
#include <iostream>using Poco::Net::TCPServer;
using Poco::Net::TCPServerConnectionFilter;
using Poco::Net::TCPServerConnection;
using Poco::Net::TCPServerConnectionFactory;
using Poco::Net::TCPServerConnectionFactoryImpl;
using Poco::Net::StreamSocket;
using Poco::UInt16;
using Poco::NumberParser;
using Poco::Logger;
using Poco::Event;
using Poco::NamedEvent;
using Poco::Process;
using Poco::ProcessImpl;
using Poco::Exception;namespace
{class ClientConnection: public TCPServerConnection{public:ClientConnection(const StreamSocket& s): TCPServerConnection(s){}void run(){StreamSocket& ss = socket();char buffer[256];int n = ss.receiveBytes(buffer, sizeof(buffer));while (n > 0){std::cout << "Received " << n << " bytes:" << std::endl;std::string msg;Logger::formatDump(msg, buffer, n);std::cout << msg << std::endl;n = ss.receiveBytes(buffer, sizeof(buffer));}}};typedef TCPServerConnectionFactoryImpl<ClientConnection> TCPFactory;Event terminator;
}int main(int argc, char** argv)
{Poco::UInt16 port = NumberParser::parse((argc > 1) ? argv[1] : "2001");TCPServer srv(new TCPFactory(), port);srv.start();std::cout << "TCP server listening on port " << port << '.'<< std::endl << "Press Ctrl-C to quit." << std::endl;terminator.wait();return 0;
}

10、Poco::Net::SocketReactor反应堆框架

反应器框架基于反应器设计模式。
它是非阻塞套接字和select()与NotificationCenter.的联合
Poco::Net::SocketReactor观察任意数量的套接字的状态,并在套接字的状态发生变化(变为可读、可写或发生错误)时发送通知。

使用Poco::Net::SocketReactor类注册一个套接字和一个回调函数。
SocketReactor与SocketAcceptor一起使用。SocketAcceptor等待传入的连接。
当一个新的连接请求到达时,SocketAcceptor接受这个连接并创建一个新的ServiceHandler对象来处理这个连接。
当ServiceHandler处理完连接后,它必须删除自己

11、HTTPServer

POCO包含一个现成的HTTP服务器框架

  • 多线程
  • HTTP 1.0/1.1
  • 认证支持
  • cookie支持
  • 使用NetSSL库访问HTTPS

简单示例:

#include "Poco/Net/HTTPRequestHandlerFactory.h"
#include "Poco/Net/HTTPServerRequest.h"
#include "RootHandler.h"
#include "DataHandler.h"
class MyRequestHandlerFactory: publicPoco::Net::HTTPRequestHandlerFactory 
{ 
public: MyRequestHandlerFactory() {}Poco::Net::HTTPRequestHandler* createRequestHandler(const Poco::Net::HTTPServerRequest& request){if (request.getURI() == "/") return new RootHandler(); else return new DataHandler(); } 
};int main(int argc, char** argv)
{Poco::UInt16 port = 9999; HTTPServerParams* pParams = new HTTPServerParams; pParams->setMaxQueued(100); pParams->setMaxThreads(16); ServerSocket svs(port);HTTPServer srv(new MyRequestHandlerFactory(), svs, pParams);  srv.start(); waitForTerminationRequest(); srv.stop();
}

常用类:

Poco::Net::HTTPClientSession
Poco::Net::HTTPStreamFactory
Poco::Net::HTMLForm
Poco::Net::HTTPCookie
Poco::Net::HTTPRequest
Poco::Net::HTTPResponse

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

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

相关文章

搞笑视频无水印下载,高清无水印视频网站!

搞笑视频无水印下载这件事情一直困扰了广大网友&#xff0c;每当看见好玩好笑的搞笑视频然而下载下来的时候&#xff0c;要么画质模糊就带有水印今天分享大家几个搞笑视频无水印下载方法。 这是一个非常良心的搞笑视频无水印下载小程序水印云&#xff0c;它支持图片去水印、视…

HITOS_LAB5 进程运行轨迹的跟踪与统计

5. 进程运行轨迹的跟踪与统计 5.1. 实验目的 掌握 Linux 下的多进程编程技术&#xff1b;通过对进程运行轨迹的跟踪来形象化进程的概念&#xff1b;在进程运行轨迹跟踪的基础上进行相应的数据统计&#xff0c;从而能对进程调度算法进行实际的量化评价&#xff0c; 更进一步加…

高德地图加载三维模型vue(.obj转.gltf)

官方glTF模型案例 obj2gltf 的开发文档 第一步&#xff1a;这里首先要将我们的.obj文件转换为.gltf文件 全局安装 npm install -g obj2gltf终端打开.obj文件所在的文件夹执行 obj2gltf -i model.obj -o model.gltf -t &#xff08;-i model.obj对应你的obj文件的名字&#x…

Node包管理工具 - nvm、npm、yarn、cnpm、pnpm

转载说明 原文地址 简介 nvm : 可以实现一台电脑&#xff0c;拥有多个版本的Node npm : node package manager 下载Node后自带的一个包管理工具 yarn : npm 的升级版&#xff0c;更优秀 cnpm : 配置下载非官方地址的依赖&#xff08;淘宝、华为、腾讯镜像&#xff09; pnpm :…

前端时间的失败总结复盘

分享失败经验&#xff0c;前段时间的总结复盘&#xff1a; 与伙伴合作面对异常决策要及时提出质疑&#xff0c;怼&#xff0c;别太客气&#xff0c;客气起来&#xff0c;小心翼翼在意他人情绪那么这个项目就会让人难受&#xff0c;不要因为因为伙伴身上有标签/光环/权威就觉得…

java后端自学错误总结

java后端自学错误总结 MessageSource国际化接口总结 MessageSource国际化接口 今天第一次使用MessageSource接口,比较意外遇到了一些坑 messageSource是spring中的转换消息接口&#xff0c;提供了国际化信息的能力。MessageSource用于解析 消息&#xff0c;并支持消息的参数化…

题目:区间更新(蓝桥OJ 3291)

题目描述&#xff1a; 解题思路&#xff1a; 差分模板题。 题解&#xff1a; #include<bits/stdc.h> using namespace std;const int N 1e5 10; int a[N], diff[N] ;//数组的大小不可能开到大于1e9int res(int n, int m) {for(int i 1; i < n; i)cin >&g…

抖音视频如何无水印保存?抖音视频无水印保存教程

抖音视频如何无水印保存&#xff1f;当下短视频盛行时代&#xff0c;抖音作为当下主流短视频平台之一&#xff0c;每天都有数以亿计的用户在抖音上分享自己的创作&#xff0c;然后当我们遇到感兴趣的视频&#xff0c;下载保存后会发现带有水印&#xff0c;那么抖音视频如何无水…

人、机不同在于变与多

人擅长变&#xff0c;如变模态、变尺度&#xff0c;而机器侧重多&#xff0c;如多模态、多尺度。 人类擅长变化的能力是由于我们的大脑和思维能力的灵活性所决定的。我们可以通过学习和适应&#xff0c;改变我们的态度、行为方式和观点&#xff0c;以适应不同的情境和环境。例如…

51 代码审计-PHP框架MVC类上传断点调试挖掘

目录 知识点1:知识点2:知识点3:演示案例:PHPStormxdebu断点调试演示Beescms无框架后台任意文件上传Finecms基于前台MVC任意文件上传CItphp基于前台TP5框架任意文件上传 涉及资源: 知识点1: #关键字搜索: (函数&#xff0c;关键字&#xff0c;全局变量等) 文件上传&#xff0c;…

国标GB28181协议/RTSP视频监控汇聚平台EasyCVR(V.3.4)页面UI大更新

为提高用户体验&#xff0c;增强平台功能&#xff0c;旭帆科技的Easy系列平台也在不断优化更新中。在最新的EasyCVR&#xff08;V.3.4&#xff09;中&#xff0c;其最显著的区别即为首页UI的调整。 其亮点是在【配置中心】-【基础配置】-【展示信息】中&#xff0c;首页UI可分…

短视频账号矩阵系统源码/saas独立源头技术开发

一、批量剪辑&#xff08;采用php语言&#xff0c;数学建模&#xff09; 短视频合成批量剪辑的算法主要有以下几种&#xff1a; 1. 帧间插值算法&#xff1a;通过对多个视频的帧进行插帧处理&#xff0c;从而合成一段平滑的短视频。 2. 特征提取算法&#xff1a;提取多个视频中…

Spring容器启动过程中的自定义操作插口汇总

目录标题 PostConstruct注解EventListener方式InitializingBean的afterPropertiesSet方法实现ApplicationRunner接口重写run方法实现AplicationContextAware接口重写setApplicationContext实现ServletContextListener接口contextInitialized方法实现ServletContextAware接口set…

MacDroid Pro for Mac – 安卓设备文件传输助手,实现无缝连接与传输!

想要在Mac电脑上轻松管理和传输您的安卓设备文件吗&#xff1f;MacDroid Pro for Mac 是您的最佳选择&#xff01;这款强大的文件传输助手可以让您在Mac上与安卓设备之间实现快速、方便的文件传输。 MacDroid Pro for Mac 提供了简单易用的界面&#xff0c;让您能够直接在Mac上…

WordPress插件大全-免费的WordPress插件汇总

随着互联网的不断发展&#xff0c;网站建设变得日益普及。对于大多数人而言&#xff0c;WordPress是一个熟悉且易于使用的网站建设平台。然而&#xff0c;有时候我们可能会觉得WordPress的功能还不够满足我们的需求&#xff0c;这时候&#xff0c;插件就成了解决问题的得力工具…

数据库管理-第122期 配置Halo数据库(202301204)

数据库管理-第122期 配置Halo数据库&#xff08;202301204&#xff09; 在120期完成了HaloDB的安装&#xff0c;那么紧接着就需要对数据库进行具体配置。 1 数据库配置 这里首先说一下我这里数据库的给的硬件配置&#xff1a;2个CPU&#xff0c;16GB内存 1 配置数据库访问控…

记录一下Mac配置SpringBoot开发环境

由于很多项目喜欢使用传统的 Java 8 进行开发&#xff0c;而且 Java 8 的稳定性也是经过长久考验的&#xff0c;我们接下来就尝试一下&#xff0c;在一台新的 Mac 中配置 Java 环境&#xff0c;并且开始创建 SpringBoot 项目。 首先&#xff0c;去 Oracle 官网下载 java8 JDK …

通过时间交织技术扩展ADC采样速率的简要原理

前言 数据采集是将自然界中存在的模拟信号通过模数转换器&#xff08;ADC&#xff09;转换成数字信号&#xff0c;再对该数字信号进行相应的接收和处理。数据采集系统作为数据采集的手段&#xff0c;在移动通信、图向采集、无线电等领域有重要作用。随着电子信息技术的飞速发展…

感冒 发烧 咳嗽记录

感冒 风寒: 清鼻涕 热感冒: 细菌记录, 脓鼻涕. 咳嗽 先是清痰咳嗽, 后是浓痰,细菌感染, 白细胞噬菌体, 所以要补充蛋白质,维生素. 胸骨上窝 , 天突穴 ,后面上支气管的位置, 往下会变成左右两支,连接到肺部 普通咳嗽: 用哈气拍打背部的方式. 把痰去除. 吃点 盐酸氨溴索片 增加支…

怎么让百度快速收录,百度SEO收录工具

百度收录对于一个网站的重要性不言而喻。拥有良好的百度收录意味着网站能够更好地被搜索引擎收录&#xff0c;为用户提供更精准的搜索结果。而怎样实现百度快速收录成为了许多网站管理员关注的焦点。 百度收录的重要性 百度是国内最大的搜索引擎之一&#xff0c;拥有数以亿计的…