c++ - boost asio - 缺陷代码的更改

标签 c++ sockets network-programming boost-asio

我将这段代码作为 socks5 代理服务器实现的一部分。这是服务器与代理客户端(在代码中 - socket_)和目标服务器(在代码 clientSock_ 中)建立通信套接字的部分,它接收在套接字上发送的数据并将其与在另一个套接字上发送的数据交换。

我指定此交换已经发生在服务器为代理客户端生成的线程中。

    std::size_t readable = 0;

    boost::asio::socket_base::bytes_readable command1(true);
    boost::asio::socket_base::bytes_readable command2(true);


    try 
    {
        while (1)
        {
            socket_->io_control(command1);
            clientSock_->io_control(command2);

            if ((readable = command1.get()) > 0)
            {
                transf = ba::read(*socket_, ba::buffer(data_,readable));
                ba::write(*clientSock_, ba::buffer(data_,transf));
                boost::this_thread::sleep(boost::posix_time::milliseconds(500));
            }

            if ((readable = command2.get()) > 0)
            {
                transf = ba::read(*clientSock_, ba::buffer(data_,readable));
                ba::write(*socket_, ba::buffer(data_,transf));
                boost::this_thread::sleep(boost::posix_time::milliseconds(500));
            }
        }
    }
    catch (std::exception& ex)
    {
        std::cerr << "Exception in thread while exchanging: " << ex.what() << "\n";
        return;
    }

这里的问题是我在循环中有非常高的 CPU。另外我不确定这里是否知道其中一个部分是否关闭套接字的方法是捕获升压套接字异常 -> 并结束数据交换。

最佳答案

这个问题可以通过使用异步写/读函数来解决。基本上使用 async_read_some()async_write() - 或这些类别中的其他异步函数。此外,为了使异步处理工作,必须在调用至少一个异步函数后调用 io_service.run() - 这将为异步处理分派(dispatch)完成处理程序。

关于c++ - boost asio - 缺陷代码的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9044690/

相关文章:

c++ - cmake 给出 undefined reference

c++ - 游戏图形界面框架

C++访问url日志

c - 如何使用套接字 api 发送和接收字节?

node.js - 使用套接字代替ajax进行客户端/服务器通信

Java Math Server - 客户端问题

c++ - 嵌入式编程中宏值之间的比较是否不好?

c++ - 距离使我的迭代器 "freeze"

c - 奇怪的 udp 套接字 sendto 行为

Java 多客户端服务器套接字。管道破裂检测