boost asio - 编写等效的代码段
我有这段使用标准套接字的代码:
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代理来自我的浏览器客户端,但在上面的版本中ProxySession::Start在任何情况下都不会导致HandleProxyRead被调用。
我真的不需要在这里交换数据的异步方式,只是我在这里提出了这个解决方案。另外,从我调用 ProxySession->start from code 的地方,我需要引入睡眠,否则执行此操作的线程上下文将被关闭。
*更新 2 * 请参阅下面我的更新之一。问题块变得太大了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
该问题可以通过使用异步写/读函数来解决,以便与所提供的代码具有类似的功能。基本上使用 async_read_some()/async_write() - 或这些类别中的其他异步函数。另外,为了使异步处理正常工作,必须调用 boost::asio::io_service.run() ,它将为异步处理调度完成处理程序。
The problem ca be solved by using asynchronous write/read functions in order to have something similar with presented code. Basically use async_read_some()/async_write() - or other async functions in these categories. Also in order for async processing to work one must call boost::asio::io_service.run() that will dispatch completion handler for async processing.
我已经成功做到了这一点。该解决方案解决了2个套接字的“数据交换”问题(根据socks5服务器代理,这必须发生),但它的计算量很大。有什么想法吗?
I have managed to come with this. This solution solves the problem of "data exchange" for the 2 sockets (that must happen acording to socks5 server proxy) but it is very compute intensive. Any ideas ?