【发布时间】:2021-05-01 04:42:02
【问题描述】:
#include <boost/thread.hpp>
#include <boost/bind.hpp>
#include <boost/asio.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
using namespace boost::asio;
typedef boost::shared_ptr<ip::tcp::socket> socket_ptr;
boost::asio::io_service service;
boost::asio::ip::tcp::endpoint ep(ip::tcp::v4(), 2001);
boost::asio::ip::tcp::acceptor acc(service, ep);
socket_ptr sock_ptr(new ip::tcp::socket(service));
void handle_accept(socket_ptr sock, const boost::system::error_code &err);
void start_accept(socket_ptr sock);
void handle_accept(socket_ptr sock_ptr_, const boost::system::error_code &err)
{
if (err) return;
socket_ptr sock_ptr_(new ip::tcp::socket(service));
start_accept(sock_ptr_);
}
void start_accept(socket_ptr sock_ptr_)
{
acc.async_accept(*sock_ptr_, boost::bind(handle_accept, sock_ptr_, _1) );
}
int main()
{
start_accept(sock_ptr);
service.run();
}
编译后的代码报错,但不清楚错误在哪里。我想请你帮忙解决这个难题
/mnt/hgfs/share/home/Cpp/tcp/io_service/task_3/service/server.cpp: In function ‘void handle_accept(socket_ptr, const boost::system::error_code&)’:
/mnt/hgfs/share/home/Cpp/tcp/io_service/task_3/service/server.cpp:21:25: error: declaration of ‘socket_ptr sock_ptr_’ shadows a parameter
socket_ptr sock_ptr_(new ip::tcp::socket(service));
^
"g++" -ftemplate-depth-128 -O0 -fno-inline -Wall -g -fPIC -std=c++11 -c -o "bin/gcc-4.8/debug/server.o" "/mnt/hgfs/share/home/Cpp/tcp/io_service/task_3/service/server.cpp"
...failed gcc.compile.c++ bin/gcc-4.8/debug/server.o...
...skipped <p/mnt/hgfs/share/home/Cpp/tcp/io_service/task_3/stage>service for lack of <pbin/gcc-4.8/debug>server.o...
...failed updating 1 target...
...skipped 1 target...
【问题讨论】:
-
这正是错误消息所说的:
handle_accept接受一个名为sock_ptr_的参数,并且还声明了一个名为sock_ptr_的局部变量。一旦声明了局部变量,就不能再访问该参数。作为第一步,给变量一个不同的名字,以避免混淆。但是,handle_accept采用了一个它无意使用的参数,这是值得怀疑的。你真的是想创建一个新的套接字,而不是使用作为参数传递的那个吗? -
非常感谢。我好像一下子就明白自己错在哪里了。
-
书中描述“使用这个socket后,你创建一个新的socket,然后再次调用start_accept()创建另一个‘等待客户端连接’的异步操作,让服务.run () 循环一直很忙”。我应该处理传入的参数 sockt
-
我不知道,我对您使用的库不熟悉。如果您确实应该操作两个不同的
socket_ptr实例,请给它们不同的名称。
标签: c++ boost-asio shared-ptr