gpt4 book ai didi

c++ - boost asio - 编写等效的代码

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:28 24 4
gpt4 key购买 nike

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

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);
}

我有套接字客户端和连接器,我需要“代理”它们之间的流量(这是 socks5 服务器实现的一部分,您可能会看到 https://github.com/mfontanini/Programs-Scripts/blob/master/socks5/socks5.cpp )。我怎样才能在 asio 下实现这一目标?

我必须说明,直到此时,两个套接字都在阻塞模式下运行。

尝试使用它但没有成功:

ProxySession::ProxySession(ba::io_service& ioService, socket_ptr socket, socket_ptr clientSock): ioService_(ioService), socket_(socket), clientSock_(clientSock)
{

}

void ProxySession::Start()
{
socket_->async_read_some(boost::asio::buffer(data_, 1),
boost::bind(&ProxySession::HandleProxyRead, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}

void ProxySession::HandleProxyRead(const boost::system::error_code& error,
size_t bytes_transferred)
{
if (!error)
{
boost::asio::async_write(*clientSock_,
boost::asio::buffer(data_, bytes_transferred),
boost::bind(&ProxySession::HandleProxyWrite, this,
boost::asio::placeholders::error));
}
else
{
delete this;
}
}


void ProxySession::HandleProxyWrite(const boost::system::error_code& error)
{
if (!error)
{
socket_->async_read_some(boost::asio::buffer(data_, max_length),
boost::bind(&ProxySession::HandleProxyRead, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
else
{
delete this;
}
}

问题是,如果我执行 ba::read(*socket_, ba::buffer(data_,256)) 我可以通过 socks 代理读取来 self 的浏览器客户端的数据,但是在ProxySession::Start 上面的版本在任何情况下都不会导致调用 HandleProxyRead。

我真的不需要在这里交换数据的异步方式,只是我在这里找到了这个解决方案。同样在我调用 ProxySession->start from code 的地方,我需要引休眠眠,否则执行它的线程上下文将被关闭。

*更新 2 * 请参阅下面我的更新之一。问题 block 太大了。

最佳答案

这个问题可以通过使用异步写/读函数来解决,以便与提供的代码有相似之处。基本上使用 async_read_some()/async_write() - 或这些类别中的其他异步函数。此外,为了使异步处理工作,必须调用 boost::asio::io_service.run() ,它会为异步处理分派(dispatch)完成处理程序。

关于c++ - boost asio - 编写等效的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9044045/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com