C++ boost asio—编写等效的代码段

C++ boost asio—编写等效的代码段,c++,sockets,boost-asio,socks,C++,Sockets,Boost Asio,Socks,我有一段使用标准套接字的代码: void set_fds(int sock1, int sock2, fd_set *fds) { FD_ZERO (fds); FD_SET (sock1, fds); FD_SET (sock2, fds); } void do_proxy(int client, int conn, char *buffer) { fd_set readfds; int result, nfds = max(client, co

我有一段使用标准套接字的代码:

void set_fds(int sock1, int sock2, fd_set *fds) {
    FD_ZERO (fds);
    FD_SET (sock1, fds); 
    FD_SET (sock2, fds); 
}

void do_proxy(int client, int conn, char *buffer) {
    fd_set readfds; 
    int result, nfds = max(client, conn)+1;
    set_fds(client, conn, &readfds);
    while((result = select(nfds, &readfds, 0, 0, 0)) > 0) {
        if (FD_ISSET (client, &readfds)) {
            int recvd = recv(client, buffer, 256, 0);
            if(recvd <= 0)
                return;
            send_sock(conn, buffer, recvd);
        }
        if (FD_ISSET (conn, &readfds)) {
            int recvd = recv(conn, buffer, 256, 0);
            if(recvd <= 0)
                return;
            send_sock(client, buffer, recvd);
        }
        set_fds(client, conn, &readfds);
    }
问题是,如果我执行
ba::read(*socket,ba::buffer(data,256))
操作,我可以通过socks代理读取来自浏览器客户端的数据,但在上述版本中,ProxySession::Start在任何情况下都不会导致调用HandleProxyRead

在这里,我真的不需要一种异步的数据交换方式,它;只是我在这里找到了这个解决方案。另外,在我调用ProxySession->start from代码的地方,我需要引入睡眠,因为否则,执行睡眠的线程上下文将被关闭


*更新2*请参见下面我的一个更新。问题块太大了。

我已经设法解决了这个问题。此解决方案解决了两个套接字的“数据交换”问题(必须根据socks5服务器代理进行),但计算量非常大。有什么想法吗

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;
    }
std::size\u t readable=0;
boost::asio::socket\u base::bytes\u可读命令1(true);
boost::asio::socket\u base::bytes\u可读命令2(true);
尝试
{
而(1)
{
插座->io控制(命令1);
clientSock_->io_控件(command2);
如果((readable=command1.get())>0)
{
transf=ba::read(*套接字,ba::缓冲区(数据,可读));
ba::write(*clientSock,ba::buffer(data,transf));
boost::this_线程::sleep(boost::posix_时间::毫秒(500));
}
如果((readable=command2.get())>0)
{
transf=ba::read(*clientSock,ba::buffer(data,readable));
ba::write(*套接字,ba::缓冲区(数据,传输));
boost::this_线程::sleep(boost::posix_时间::毫秒(500));
}
}
}
捕获(标准::异常和例外)
{

std::cerr可以通过使用异步写/读函数来解决这个问题,以便获得与所提供的代码类似的内容。基本上在这些类别中使用async_read_some()/async_write()-或其他异步函数。同样,为了使异步处理工作,必须调用boost::asio::io_service.run()这将为异步处理分派完成处理程序。

您尝试过什么?阅读asio文档,尝试转换代码。如果您在某个特定问题上被阻止,请询问。但不要期望人们在这里为您进行转换。@Mat基本上在这一点之前,我在这些套接字上使用了asio::Read和asio::write。但是当尝试使用aync_读取/异步_写入它们不再工作。包括有问题的详细信息。
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;
    }