首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Boost::asio中的简单数据传输?

Boost::asio中的简单数据传输?
EN

Stack Overflow用户
提问于 2017-08-16 09:48:31
回答 1查看 245关注 0票数 0

查看这两个简单的服务器客户端程序。就像第一种情况。客户端正在向服务器传输数据,并且Vies Versa是可能的。但是当我尝试同时或连续地做的时候。他们被困在竞速状态。

客户端程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <boost/asio.hpp>

void read(boost::asio::ip::tcp::socket& socket1, boost::system::error_code error_code)
{
    boost::asio::streambuf streambuf;
    boost::asio::read(socket1, streambuf, error_code);

    std::istream streambuf1(&streambuf);
    std::string string;
    streambuf1 >> string;
    std::cout << string << std::endl;
}

void write(boost::asio::ip::tcp::socket& socket1, boost::system::error_code error_code)
{
    std::string string("hello");
    boost::asio::write(socket1, boost::asio::buffer(string), error_code);
}

int main(int argc, char *argv[])
{
    boost::asio::io_service io_service;
    boost::asio::ip::tcp::socket socket1(io_service);
    boost::asio::ip::tcp::resolver resolver(socket1.get_io_service());
    boost::asio::ip::tcp::resolver::query query(boost::asio::ip::tcp::v4(), "9999");
    boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);
    boost::asio::connect(socket1, iterator);
    boost::system::error_code error_code;

    read(socket1, error_code);
    write(socket1, error_code);
    io_service.run();
    return 0;
}

这是一个简单的服务器程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <boost/asio.hpp>

void handler(boost::system::error_code &error_code, size_t size)
{
}

void read(boost::asio::ip::tcp::socket &socket1, boost::system::error_code error_code)
{
    boost::asio::streambuf streambuf;
    boost::asio::read(socket1, streambuf, error_code);

    std::istream streambuf1(&streambuf);
    std::string string;
    streambuf1 >> string;
    std::cout << string << std::endl;
}

void write(boost::asio::ip::tcp::socket &socket1, boost::system::error_code error_code)
{
    std::string string("hello");
    boost::asio::write(socket1, boost::asio::buffer(string), error_code);
}

int main()
{
    boost::asio::io_service io_service;
    boost::asio::ip::tcp::socket socket1(io_service);
    boost::asio::ip::tcp::acceptor acceptor(io_service,
                                            boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 9999));
    boost::system::error_code error_code;
    acceptor.accept(socket1, error_code);
    if (error_code != nullptr)
    {
        std::cerr << error_code.message() << std::endl;
    }
    write(socket1, error_code);
    read(socket1, error_code);

    io_service.run();
    return 0;
}

是我的方法错了,还是我使用boost::asio::async_write()方法来回传输数据。

EN

回答 1

Stack Overflow用户

发布于 2017-08-17 09:53:36

如果您查看一下boost::asio::streambuf的文档,就可以在Examples部分中发现您可能做错了什么。

首先,你的客户连接到...什么地址? 0.0.0.0?你真的应该指定它应该连接到哪里。这确实抛出了一个错误,因为您没有处理connect上的error-case。也许你没有提供正确的代码来重现?

如果您不想随机崩溃,请处理所有可能的错误情况。

Boost已经帮助你解决了输出参数的错误。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
boost::asio::ip::tcp::resolver::query query(boost::asio::ip::tcp::v4(), "9999"); //0.0.0.0 ?

//---

boost::asio::ip::tcp::resolver::query query("localhost", "9999"); //Specify where to connect
boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);
boost::asio::connect(socket1, iterator);

现在,您可以连接到您的远程合作伙伴,您还希望接收发送的消息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
boost::asio::streambuf streambuf;

//Reserve some bytes for data (here adjusted for your message 'hello')
boost::asio::streambuf::mutable_buffers_type buf = streambuf.prepare(5); //Refer to documentation
auto sizeReceived = boost::asio::read(socket1, buf, error_code);
//Received bytes are 'committed'
streambuf.commit(sizeReceived);

std::istream streambuf1(&streambuf);
std::string string;
streambuf1 >> string;
std::cout << string << std::endl; //'hello'

除此之外,这是我用来测试你的样本的完整代码(不要介意基类)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Runable
{
public:
    virtual void Run() = 0;
};

class Client : public Runable
{
public:
    void Run() override
    {
        boost::asio::io_service io_service;
        boost::asio::ip::tcp::socket socket1(io_service);
        boost::asio::ip::tcp::resolver resolver(socket1.get_io_service());
        boost::asio::ip::tcp::resolver::query query("localhost", "9999"); //Specify where to connect
        boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);
        boost::asio::connect(socket1, iterator);
        boost::system::error_code error_code;

        read(socket1, error_code);
        write(socket1, error_code);
        io_service.run();
    }

private:
    void read(boost::asio::ip::tcp::socket& socket1, boost::system::error_code error_code)
    {
        boost::asio::streambuf streambuf;

        boost::asio::streambuf::mutable_buffers_type buf = streambuf.prepare(5); //Refer to documentation
        auto sizeReceived = boost::asio::read(socket1, buf, error_code);
        streambuf.commit(sizeReceived);

        std::istream streambuf1(&streambuf);
        std::string string;
        streambuf1 >> string;
        std::cout << __FUNCTION__ << " # " << string << std::endl;
    }

    void write(boost::asio::ip::tcp::socket& socket1, boost::system::error_code error_code)
    {
        std::string string("hello");
        boost::asio::write(socket1, boost::asio::buffer(string), error_code);
    }
};

class Server : public Runable
{
public:
    void Run() override
    {
        boost::asio::io_service io_service;
        boost::asio::ip::tcp::socket socket1(io_service);
        boost::asio::ip::tcp::acceptor acceptor(io_service,
        boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 9999));
        boost::system::error_code error_code;
        acceptor.accept(socket1, error_code);
        if (error_code != nullptr)
        {
            std::cerr << error_code.message() << std::endl;
        }
        write(socket1, error_code);
        read(socket1, error_code);

        io_service.run();
    }

private:
    void read(boost::asio::ip::tcp::socket &socket1, boost::system::error_code error_code)
    {
        boost::asio::streambuf streambuf;

        boost::asio::streambuf::mutable_buffers_type buf = streambuf.prepare(5);
        auto sizeReceived = boost::asio::read(socket1, buf, error_code);
        streambuf.commit(sizeReceived);

        std::istream streambuf1(&streambuf);
        std::string string;
        streambuf1 >> string;
        std::cout << __FUNCTION__ << " # " << string << std::endl;
    }

    void write(boost::asio::ip::tcp::socket &socket1, boost::system::error_code error_code)
    {
        std::string string("hello");
        boost::asio::write(socket1, boost::asio::buffer(string), error_code);
    }
};

int wmain(int argv, wchar_t **args)
{
    std::thread st = std::thread([]() { Server s; s.Run(); });
    std::thread ct = std::thread([]() { std::this_thread::sleep_for(std::chrono::milliseconds(100)); Client c; c.Run(); });

    st.join();
    ct.join();

    return 0;
}

其中,输出为:

还请注意,除非提供的缓冲区已满,否则boost::asio::read不会返回。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45710286

复制
相关文章
boost asio
asio包含errorcode参数的函数,不会抛出异常 可以尝试connect之后,判断错误码, boost::asio::error::already_connected 则表示已经连接 断开连接使用close,is_open不表示通断,close后需要open,connect自动打开
sofu456
2020/09/14
1.4K0
boost asio通信
void DHNetwork::Network::CreateTCPServer(unsigned short port,CRRMCommon* recv) { boost::thread([port, recv]{ boost::asio::io_service io_serv; std::vector<std::shared_ptr<DHNetwork::Network>>::iterator it; tcp::acceptor server_acceptor(io_serv, tcp::
sofu456
2020/09/24
9060
Boost asio 心得笔记
Boost asio中有两点用的不爽: 1. asio中的所有对象都引用io_service 2. async_write还要自己保证内存在completed之前有效 有空要把这两点搞的更傻瓜一点,实际上在全异步模式下NET IO分配两个线程足矣,async搞一个队列,completed时候删掉,还可以通过writev优化写, 现在在做的一个redrabbit lib 就是在boost asio上封装的更傻瓜一点。 http://code.google.com/p/redrabbit/source/brow
知然
2018/03/09
1.9K0
试试Boost.Asio
慢慢一点一点看看Boost,这段时间就Asio库吧。 据说这货和libevent的效率差不多,但是Boost的平台兼容性,你懂得。还有它帮忙干掉了很多线程安全和线程分发的事情。
owent
2018/08/01
4K0
Boost ASIO proactor 浅析
Boost ASIO proactor 浅析 前情提要: Boost asio 的socket的异步非阻塞模式才有的是proactor模式,当IO操作介绍后回调相应的处理函数。ASIO在Linux平台下的实现基于epoll,但是epoll只支持reactor模式,ASIO通过封装在epoll上实现了proactor。提到ASIO proactor,ASIO中的所有异步操作都是基于io_service实现的,io_service是ASIO中的任务队列,并且他负责调用epoll_wait等待IO事件到来,对io
知然
2018/03/09
2.5K0
试试Boost.Asio
慢慢一点一点看看Boost,这段时间就Asio库吧。 据说这货和libevent的效率差不多,但是Boost的平台兼容性,你懂得。还有它帮忙干掉了很多线程安全和线程分发的事情。
owent
2023/03/06
1.9K0
Boost asio 官方教程
7.1. 概述 本章介绍了 Boost C++ 库 Asio,它是异步输入输出的核心。 名字本身就说明了一切:Asio 意即异步输入/输出。 该库可以让 C++ 异步地处理数据,且平台独立。 异步数据处理就是指,任务触发后不需要等待它们完成。 相反,Boost.Asio 会在任务完成时触发一个应用。 异步任务的主要优点在于,在等待任务完成时不需要阻塞应用程序,可以去执行其它任务。 异步任务的典型例子是网络应用。 如果数据被发送出去了,比如发送至 Internet,通常需要知道数据是否发送成功。
_gongluck
2018/03/09
17.8K0
使用 boost.asio 简单实现 异步Socket 通信
 客户端: class IPCClient { public: IPCClient(); ~IPCClient(); bool run(); private: bool connect(); bool conn_handler(const boost::system::error_code&ec, boost::shared_ptr<boost::asio::ip::tcp::socket> sock); bool read_handler(const boo
西湖醋鱼
2020/12/30
1.7K0
Boost.Asio C++网络编程
Boost.Asio是一个跨平台的、主要用于网络和其他一些底层输入/输出编程的C++库。最近找到一个关于Boost Asio的中文教程,名叫《Boost.Asio C++网络编程》,在线地址为:Boost.Asio C++网络编程,感兴趣的话可以看一下。 如下图所示:
ccf19881030
2021/01/29
1.9K0
Boost::asio io_service 实现分析
Boost::asio io_service 实现分析 io_service的作用 io_servie 实现了一个任务队列,这里的任务就是void(void)的函数。Io_servie最常用的两个接口是post和run,post向任务队列中投递任务,run是执行队列中的任务,直到全部执行完毕,并且run可以被N个线程调用。Io_service是完全线程安全的队列。 Io_servie的接口 提供的接口有run、run_one、poll、poll_one、stop、reset、dispatch、post,最常
知然
2018/03/09
2.1K0
第32章.Boost.Asio-网络编程
即使Boost.Asio可以异步处理任何类型的数据,它也主要用于网络编程。 这是因为Boost.Asio在添加了其他I / O对象之前很早就支持网络功能。 网络功能非常适合异步操作,因为通过网络传输数据可能会花费很长时间,这意味着确认和错误可能无法像发送或接收数据的功能可以执行的速度那样快。
ccf19881030
2020/06/09
2.6K0
eos源码赏析(四):基于boost::asio的httpserver架构
eos代码更新很快,在4月初已经升级到3.0版本,随着版本的更迭,在各个操作系统下的编译、节点的运行都越来越集成化,不需要自己再一步步的下载依赖,如果感兴趣可以直接按照官方wiki进行编译。官方wiki地址:https://github.com/EOSIO/eos/wiki
用户2569546
2021/11/23
1.6K0
Boost.Asio和ACE之间关于Socket编程的比较
ACE是一个很成熟的中间件产品,为自适应通讯环境,但它过于宏大,一堆的设计模式,架构是一层又一层,对初学者来说,有点困难。
用户4766018
2022/08/19
1.6K0
C++ ASIO 实现异步套接字管理
Boost ASIO(Asynchronous I/O)是一个用于异步I/O操作的C++库,该框架提供了一种方便的方式来处理网络通信、多线程编程和异步操作。特别适用于网络应用程序的开发,从基本的网络通信到复杂的异步操作,如远程控制程序、高并发服务器等都可以使用该框架。该框架的优势在于其允许处理多个并发连接,而不必创建一个线程来管理每个连接。最重要的是ASIO是一个跨平台库,可以运行在任何支持C++的平台下。
微软技术分享
2023/10/11
2950
C++ ASIO 实现异步套接字管理
C++ ASIO 实现异步套接字管理
Boost ASIO(Asynchronous I/O)是一个用于异步I/O操作的C++库,该框架提供了一种方便的方式来处理网络通信、多线程编程和异步操作。特别适用于网络应用程序的开发,从基本的网络通信到复杂的异步操作,如远程控制程序、高并发服务器等都可以使用该框架。该框架的优势在于其允许处理多个并发连接,而不必创建一个线程来管理每个连接。最重要的是ASIO是一个跨平台库,可以运行在任何支持C++的平台下。
微软技术分享
2023/08/29
5300
C++ ASIO 实现异步套接字管理
Array的简单使用(Boost和STL通用)
本来这一次是想简单介绍一下Boost里面的协程库的使用的,但是Boost.Coroutine已经被废弃了,而Boost.Coroutine2目前只有非对称的协程支持,个人感觉并不是特别具有使用的价值。而C++20中的协程,IDE对其的支持并不是特别好,代码报错异常多,因此我打算在完全摸透后再考虑写这一部分的内容。
huofo
2022/03/18
6430
Array的简单使用(Boost和STL通用)
值得学习17个C/C++ 超经典开源项目
总结了17个 C/C++业内非常经典的开源项目,能够很好的帮助上手与进阶C/C++项目开发,积累项目经验。
Twcat_tree
2022/11/30
8.8K0
C++在数据分析和网络爬虫的应用
C++是一种功能强大的编程语言,提供高性能、高效性和灵活性,适用于各种应用程序。其中,数据分析是C++的一个重要领域,涉及大量数据的收集、处理和解释。C++可以有效处理使用HTTP、FTP、JSON、XML等各种协议和格式的网络通信和数据采集任务。
jackcode
2023/06/20
4120
C++在数据分析和网络爬虫的应用
C++ Boost 实现异步IO远控
Boost 利用ASIO框架实现一个跨平台的反向远控程序,该远控支持保存套接字,当有套接字连入时,自动存储到map容器,当客户下线时自动从map容器中移除,当我们需要与特定客户端通信时,只需要指定客户端ID号即可。
微软技术分享
2022/12/28
8660
论跨PC和移动平台socket库yasio的设计和实现原理
之前分享的文章是对yasio特性和用法的描述:https://blog.csdn.net/xseekerj/article/details/51891362 本文将阐述核心设计思路和原则。 当一个框架或库的诞生,必然有其原由,一个库带来的好处越大于使用代价,越容易被人接受,以下是本人对框架库设计的重要原则总结:
simdsoft
2020/01/15
1.1K0
论跨PC和移动平台socket库yasio的设计和实现原理

相似问题

boost asio ssl简单加密程序

10

C++ Boost Asio简单聊天教程

319

使用boost::asio进行简单的udp通信

11

简单的boost ASIO https不返回body

11

Boost::asio async_read简单文件上传

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文