首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么boost::asio似乎什么也不做

为什么boost::asio似乎什么也不做
EN

Stack Overflow用户
提问于 2010-07-04 11:25:06
回答 2查看 1.3K关注 0票数 0

我正在尝试以一种非常基本的方式实现irc协议。我的第一个尝试是使用boost::asio并连接到服务器并读取motd。AFAIK当它们连接时,motd被发送到每个客户端。我做了下面的测试程序,它似乎什么也做不了。这不是一段非常好的代码,但这是我在经历了几个令人沮丧的小时后所拥有的全部。

代码语言:javascript
运行
复制
#define _WIN32_WINNT 0x0501
#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <queue>



class IrcConnection
{
public:
    IrcConnection(const std::string& server, int port, boost::function<void (const std::string&)> onMessage, boost::asio::io_service& io_service): s(server), p(port), onM(onMessage), ios(io_service), socket(io_service)
    {
    }
    void connect() 
    {
        somethingHappened = false;
        //DNS stuff
        boost::asio::ip::tcp::resolver resolver(ios);
        boost::asio::ip::tcp::resolver::query query(s , "0");
        boost::asio::ip::tcp::resolver::iterator iter = resolver.resolve(query);
        boost::asio::ip::tcp::resolver::iterator end;

        boost::system::error_code error;

        while(iter != end)
        {
            boost::asio::ip::tcp::endpoint endpoint = iter->endpoint();
            endpoint.port(p);
            socket.close();
            socket.connect(endpoint, error);
            iter++;
        }
        if(error)
        {
            std::cout << "ERROR" << std::endl;
            std::cout << error << std::endl;
        }

        std::cout << "Connected to: " << socket.remote_endpoint().address().to_string() << std::endl; 

        //read from the socket until a space is found
        boost::asio::async_read_until(socket, currentData, ' ', boost::bind(&IrcConnection::onReceiveFinished, this, boost::asio::placeholders::error));
    }
    void disconnect() 
    {
        socket.close();
    }
    void send(int priority, const std::string& message) 
    {
    }
bool somethingHappened;

private:
    std::string s;
    int p;
    boost::function<void (const std::string&)> onM;
    boost::asio::io_service& ios;
    boost::asio::ip::tcp::socket socket;
    std::priority_queue<std::string> outQueue;
    boost::asio::streambuf currentData;


    void onReceiveFinished(const boost::system::error_code& error)
    {
        if(error)
        {
            disconnect();
            std::cout << "ERRORRRR" << std::endl;
            std::cout << error << std::endl;
        }

        std::cout << "STUFF IS OCCURING" << std::endl;
        somethingHappened = true;

         std::istream stream(&currentData);
         std::string data;
         std::getline(stream, data);

         boost::asio::async_read_until(socket, currentData, ' ', boost::bind(&IrcConnection::onReceiveFinished, this, boost::asio::placeholders::error));
         ios.dispatch(boost::bind(onM, data));
    }


};


void onMe(const std::string& x)
{
    std::cout << "MESSAGE" << std::endl;
    std::cout << x << std::endl;
}

int main()
{
    boost::asio::io_service ios;
    std::string server = "irc.efnet.org";
    int port = 6667;

    IrcConnection x(server, port, onMe, ios);

    x.connect();

    while(!x.somethingHappened)
    {
        //
    }

    return 0;

}

该程序尝试连接到irc.efnet.org并读取,直到发送了一个空格,然后将数据输出到终端。但是,当我运行此命令时,所有打印的内容都是我连接到的ip地址,然后程序不会终止。

我需要做什么才能得到我的缩进行为?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-04 13:02:44

如果您正在进行异步调用,则必须向io_service发送请求。对于您的情况,在"x.connect();"之后,您应该调用"ios.run();"

只要记住,如果你在异步回调返回后没有做任何进一步的posts,run将退出/返回。

顺便说一句,"ios.dispatch(boost::bind(onM, data));"中的onM是onMe吗?

票数 2
EN

Stack Overflow用户

发布于 2010-07-04 23:21:01

您混合了异步(io_service::postasync_read_until)和同步(ip::tcp::socket::connectip::tcp::endpoint::resolve)操作。这是可行的,但我真的不建议使用这种方法。坚持异步操作,使用ip::tcp::socket::async_connect而不是ip::tcp::socket::connect,使用ip::tcp::socket::async_resolve而不是ip::tcp::socket::resolve。您需要调用io_service::run或等效的函数,这就是为什么您的代码在connect之后什么也不做。Boost.Asio文档中的numerous examples说明了如何实现这一点。

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

https://stackoverflow.com/questions/3173630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档