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