U盘PE| w764位旗舰版下载 | U盘装win7系统 | U盘启动 |win7pe | win10下载 |加入收藏土豆PE官网U盘PE,U盘装win7系统,win7pe,U盘启动,U盘装系统,w764位旗舰版下载站!
当前位置:主页 > 帮助中心 > 帮助中心 >

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 客户端的例子!

  1. #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的例子和便携式助推剂。因为读起来很简单测试,理解和扩展。我希望你像我一样喜欢阅读这本书我希望编程对你很有趣

Copyright © 2012-2014 Www.tudoupe.Com. 土豆启动 版权所有 意见建议:tdsky@tudoupe.com

土豆系统,土豆PE,win7系统下载,win7 64位旗舰版下载,u盘启动,u盘装系统,win10下载,win10正式版下载,win10 RTM正式版下载,win8下载,电脑蓝屏,IE11修复,网络受限,4K对齐,双系统,隐藏分区,系统安装不了,U盘装系统,笔记本装系统,台式机装系统,diskgenius运用,GHSOT装系统,U盘修复,U盘技巧,U盘速度,U盘不能格式化,U盘复制发生错误,U盘加密,U盘选购,开机黑屏,蓝屏,进不了系统,上不了网,打不开程序,点击无反应,系统设置,PE个性化,PE添加网络,PE维护系统

点击这里给我发消息