Boost.Asio c++ 网络编程翻译(30)[完结]
来源:http://www.tudoupe.com时间:2022-05-13
PS:此结论是“促进”。本文章是我们对亚洲C++网络规划的特别报道的一部分。这是我第一个完整的翻译从开始的磕磕绊绊,到最后小有心得,我收获很多。我要组织和校准这个博客系列。我希望有兴趣的人能帮我为您提供更专业的阅读经验。更多信息,请访问InfoFinland上的
句柄追踪信息到文件
默认情况下,控点的跟踪信息导出到标准错误流( 类似于 std: cerr ) 。你很有可能将输出转移到别处。对于控制台应用,默认情况下,输出输出和错误输出都导出到同一地点。也就是控制台。然而,对于一个非命令线路Windows程序,错误流默认为空 。
您可以使用命令行改变错误输出的路径, 例如 :
some_application 2>err.txt
或者,如果你不是太懒, 你可以做代码,例如以下代码片段:
/ 微软 Windows /
HANDLE h = CreateFile(“err.txt”, GENERIC_WRITE, 0, 0, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL , 0);
SetStdHandle(STD_ERROR_HANDLE, h);
// 对于Unix
int err_file = open(“err.txt”, O_WRONLY);
dup2(err_file, STDERR_FILENO);
SSL
我道歉;Boost.Asio只为基本SSL提供了某些支助领域。背景使用 OpenSSL 。所以,如果您想雇用SSL,Omensl. Org首先获得并建造OpenSSL,然后从ww.blog.com获得并建造 OpenSSL。你需要注意,OpenSSL的开发往往不是一个无关紧要的过程。尤其是你没有共享的编译器考虑视觉工作室。
如果您成功开发 OpenSSL, Boost. Asio 将有一个环绕它的圈子:
为了告知您使用什么, 它可以替代 ip:: socket。
这是初始握手的背景 。
ssl:: rfc2818_version: 使用此类来使用符合 RFC 2818 的证书轻松认证主机名 。
您先建立并配置 SSL 上下文, 然后使用它打开连接到给定远程主机的套接字, 并进行 SSL 握手 。 一旦握手完成, 您可以使用它 。
抱歉,布斯特。 Free Asio 函数如读 */ write * 。
以下是一个与雅虎连结的 SSL 客户端的例子!
#include <boost/asio.hpp>
#include <boost/asio/ssl.hpp>
using namespace boost::asio;
io_service service;int main(int argc, char* argv[]) {
typedef ssl::streamip::tcp::socket ssl_socket;
ssl::context ctx(ssl::context::sslv23);
ctx.set_default_verify_paths();与所提供的主机建立 SSL 项链 。
io_service service;
ssl_socket sock(service, ctx);ip::tcp::resolver resolver(service);
std::string host = “www.yahoo.com”;
ip::tcp::resolver::query query(host, “https”);
connect(sock.lowest_layer(), resolver.resolve(query));
// SSL 握手
sock.set_verify_mode(ssl::verify_none);
sock.set_verify_callback(ssl::rfc2818_verification(host));
sock.handshake(ssl_socket::client);Host: "
+ host + "
Accept: */*
Connection: close";
}
第一行非常不言自明。当你们联系到远方的主机的时候,你穿袜子 我不知道你在说什么 但我不确定你在说什么 但我不确定你在说什么也就是说,因为Ssl:紧身流是一个信封, 你使用底座。接下来的三条线是握手握手一结束,您使用 Booat. Asio 的写() 函数来提出 HTTP 请求 。你应当读取自己所遭遇的一切。
当 SSL 服务结束时, 事情变得有点困难 。 抱歉, Boost. Asio 提供了一个 SSL 服务结束器的例子, 您可以在 push/ libs/ aso/ example/ sl/ server. found in cpp 中使用 。
抱歉,Boost. Asio的 Windows 属性。
以下功能只能在 Windows 中访问 。
流处理
抱歉, 但是 Boost. Asio 可以在 Windows 把手上生成一个信封 。因此,您可以使用大部分免费服务。比如read(),read_until(),write(),async_read(),Async_read_till () 和 Async_write () 是函数 。如何从文件获取一条线 :
HANDLE file = ::CreateFile(“readme.txt”, GENERIC_READ, 0, 0,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
windows::stream_handle h(service, file);
streambuf buf;
int bytes = read_until(h, buf, ’
');
std::istream in(&buf);
std::string line;
std::getline(in, line);
std::cout << line << std::endl;
只有在 I/ O 处理端口( 默认) 使用时, 才会使用流单类。 如果符合此条件, 则声明 BOOST_ ASIO_ HAS_ WINDOWS_ STREAM_ HANDLE 。
随机访问句柄
抱歉, 但是 Boost. Asio 支持随机读取和写入引用常规文件的控点 。同样,你用这个把手做一个信封然后使用自由函数,我不知道该说什么 但我不知道该说什么write_at(),async_read_at(),async_write_at()。读取100个不同地点的50字节需要50字节。您必须使用以下代码片断 :
HANDLE file = ::CreateFile(“readme.txt”, GENERIC_READ, 0, 0,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
windows::random_access_handle h(service, file);
char buf[50];
int bytes = read_at(h, 1000, buffer( buf));
std::string msg(buf, bytes);
std::cout << msg << std::endl;
就Boost. Asio而言,手柄只能随机访问。他们不能用作笔译员。也就是说,自由函数,例如,改为()read_until(),对于随机可接触的手柄,不得使用笔记()或其相对随行方式。
随机_ access_ handle 类只有在 I/ O 处理端口有效( 默认) 时才有用 。如果情况满足,BOOST_ASIO_ASIO_HAS_WINDOWS_RANDOM_ACCES_ASIO_ASIO_HAS_WINDOWS_RANDOM_ACCES_ASIO_ASIO_ASIO_ASIO_HAS_WINDOWS_RANDOM_AACCES_ANDLE SANDLE NAME NAME NAME NAME NAME NAME SAME NAME NAME NAME RAME RAND RAME RATO RAME RATO RAME RAME RAME ASI ASIO ASIO ASIOSIO ASIOSIO AS_ASIOSIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ARS_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO_ASIO( ASIO( RAS
对象句柄
您可以使用 Windows 等待核心对象 。比如修改通知,控制台输入,事件,内存资源通知,进程,信号量,等待的线条或计时器。或者简单来说,等待单对象的东西 可以被称为。在上面,你可以建一个物件手袋。使用 wait () 或 async_wait () 代替 :
void on_wait_complete(boost::system::error_code err) {}
…
HANDLE evt = ::CreateEvent(0, true, true, 0);
windows::object_handle h(service, evt);
// 同步等待
h.wait();
// 异步等待
h.async_wait(on_wait_complete);
抱歉了,Boost. Asio POSIX特性。
只有 Unix 操作系统支持这些功能。
本地socket
抱歉, 但是 Boost. Asio 只为本地插座( 众所周知的 Unix 字段套座) 提供初级支持 。
本地套接字应用程序只能为主机用户使用。本地插座可用于基本的流程间通信。您可以使用客户端或服务连接到两个端。至于本地插座端点时一个文件,比如说, /tmp/ whatever.其中一个惊人的特征是 能够批准特定文件因此,不允许计算机上指定的用户在文件上创建套接字。
在客户端套件模式下,您可以连接到以下片段:
local::stream_protocol::endpoint ep(“/tmp/my_cool_app”);
local::stream_protocol::socket sock(service);
sock.connect(ep);
您可以用以下代码做一个服务端套接字 :
::unlink(“/tmp/my_cool_app”);
local::stream_protocol::endpoint ep(“/tmp/my_cool_app”);
local::stream_protocol::acceptor acceptor(service, ep);
local::stream_protocol::socket sock(service);
acceptor.accept(sock);
只要套接字套套接字成功形成, 你就可以像其他套接字套一样使用它; 它与其他套接字组一样, 具有相同的会籍方法, 并且可以使用自由功能套接字 。
应当指出,只有当目标操作系统支持当地插座时,当地插座才可用,也就是说,如果指定,BOOST_ASIO_HAS_LOCOL_SONKETS
加入本地套件
最后,您可以连接两个插座, 要么断开( 数据报告), 要么连接( 流量) :
// 基于连接
local::stream_protocol::socket s1(service);
local::stream_protocol::socket s2(service);
local::connect_pair(s1, s2);
// 数据报
local::datagram_protocol::socket s1(service);
local::datagram_protocol::socket s2(service);
local::connect_pair(s1, s2);
在内部,它不是一个众所周知的连接POSIX技术。它基本上连接到两个插座,不需要复杂的插座设置程序;只需要一行代码。这以前曾用于便利线到线的通信。 而在现代编程中,你需要避免它,如果用索克茨的剩余代码处理的话 你会发现它非常有用
POSIX 中的文件描述符
Boost.Asio允许在一些POSIX 中的文件描述符,比如管道,标准I/O和其他设备(但是不是在不同文件上)上做一些同步和异步的操作。
一旦你为这样一个POSIX 中的文件描述符创建了一个stream_descriptor实例,您可以使用某些 Boost. Asio 提供自由功能 。比如read(),read_until(),write(),async_read(),Async_read_till () 和 Async_write () 是函数 。
如何从 Stdin 读取一行文字并将其写成 stdout :
size_t read_up_to_enter(error_code err, size_t bytes) { … }
posix::stream_descriptor in(service, ::dup(STDIN_FILENO));
posix::stream_descriptor out(service, ::dup(STDOUT_FILENO));
char buff[512];
int bytes = read(in, buffer(buff), read_up_to_enter);
write(out, buffer(buff, bytes));
串流描述符只有在目的地操作系统支持时才有用, 即如果定义, BOOST_ ASIO_ HAS_ POSIX_ StREAM_ descriptory
Fork
抱歉, 但是 Boost. Asio 启用了叉子系统呼叫器 。 您必须解释一下 Io_ service service fork () 功能何时以及如何发生 。
service.notify_fork(io_service::fork_prepare);
if (fork() == 0) {
} else {
// 父亲
… }
虽然Boost. Asio 允许您使用即将被招聘的各类服务, 我强烈建议您使用多线路线, 因为使用推力: 推力: 推力是小菜一碟。
总结
努力保持您的代码简单。 学习并使用程序。 这将减少您需要做的默认工作数量, 但只有在代码中可能存在错误时, 正如我们在调试中看到的那样 。
如果您必须使用 SSL, Boost. Asio 支持基本的 SSL 编码。
最后,如果您知道您的应用程序是用于特定的操作系统,您可以使用 Boost. Asio 的属性来操作该操作系统。
目前,网络方案拟订相当重要。抱歉 但是Boost. Asio 对任何21世纪的 C++代码器来说 都是一种必备之物我们也非常清楚这个想法。然后将其付诸实践,将这本书用作参考,并收集Asio的例子和便携式助推剂。因为读起来很简单测试,理解和扩展。我希望你像我一样喜欢阅读这本书我希望编程对你很有趣
相关新闻
- 2022-08-04 WPF的由来
- 2022-08-04 Win11勒索软件防护怎么打开?Win11安
- 2022-08-04 Windows系统jdk的配置
- 2022-08-04 Windows10 OneNote怎么重新登录?如何重
- 2022-08-04 超好用的 Windows 效率工具推荐
- 2022-08-04 Windows如何在CMD或PowerShell中配置代理
- 2022-08-04 powershell和cmd对比
- 2022-08-04 【QT】Windows下QT下载安装
- 2022-08-04 windows下 C++ 实现类属性的get和set方
- 2022-08-04 Win11快速助手在哪里?Win11打开快速
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
