我正在尝试在端口 1234 上创建 TCP 服务器。下面的代码能够在端口 1234 上创建侦听器(通过 netstat -tln 确认)并且还从远程计算机建立连接(通过 netstat -an | grep 'ESTABLISHED' 确认) 但问题是handleAccept()没有被调用
使用 boost-1-68-0/
控制器.h 文件
class Controller
{
public:
void initConnectionListener();
void setupAccept();
void handleAccept(const boost::system::error_code& e);
private:
boost::asio::io_service *mIoService;
tcp::acceptor *mAcceptor;
boost::asio::ip::tcp::socket *mSocket;
控制器.cpp文件
void Controller::initConnectionListener() {
mIoService = new boost::asio::io_service();
mAcceptor = new tcp::acceptor(*mIoService);
mSocket = new tcp::socket(*mIoService);
tcp::endpoint endpoint(tcp::v4(), 5555);
mAcceptor->open(endpoint.protocol());
mAcceptor->set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
mAcceptor->bind(endpoint);
mAcceptor->listen();
setupAccept();
mIoService->run();
}
void Controller::setupAccept(void)
{
printf("Start listening\n");
mAcceptor->async_accept(*mSocket,
boost::bind(&TestPlugController::handleAccept, this,
boost::asio::placeholders::error));
}
void Controller::handleAccept(const boost::system::error_code& e)
{
if (!e)
{
printf("Incoming TCP connection accepted\n");
}
else if (e != boost::asio::error::operation_aborted)
{
printf("handleAccept failed with error code of %d which is not equal to operation_aborted\n", e.value());
}
else
{
printf("handleAccept failed with error code of operation_aborted\n");
}
}
尚不完全清楚问题所在,但代码审查发现了一些问题。最大的问题:过度使用
new
。此外,您似乎使用了一些过时的示例代码(io_service
早已被弃用,并且不再需要mSocket
)。
这是简化和有效的:
#include <boost/asio.hpp>
#include <iostream>
using namespace std::placeholders;
namespace asio = boost::asio;
using asio::ip::tcp;
struct Controller {
void runConnectionListener() {
mAcceptor.set_option(tcp::acceptor::reuse_address(true));
acceptLoop();
mIoc.run();
}
void acceptLoop(void) {
std::cout << "Start listening" << std::endl;
mAcceptor.async_accept(bind(&Controller::handleAccept, this, _1, _2));
}
private:
void handleAccept(boost::system::error_code const& ec, tcp::socket s) {
if (!ec) {
std::cout << "connection accepted: " << s.remote_endpoint() << std::endl;
acceptLoop();
} else if (ec != asio::error::operation_aborted) {
std::cerr << "accept failed with error " << ec.message() << std::endl;
} else {
std::cerr << "accept aborted" << std::endl;
}
}
asio::io_context mIoc;
tcp::acceptor mAcceptor{mIoc, {tcp::v4(), 5555}};
};
int main() {
Controller c;
c.runConnectionListener();
}
还有本地演示: