【发布时间】:2015-12-01 00:14:56
【问题描述】:
我正在编写我的第一个 boost::asio 异步服务器,这是我放在一起的代码:
SocketServer.hpp
class SocketServer {
public:
SocketServer(boost::asio::io_service& ioService);
virtual ~SocketServer();
void StartAsync(int port);
void StopAsync();
private:
void StartAccept();
void HandleAccept();
boost::asio::ip::tcp::acceptor acceptor;
std::shared_ptr<boost::asio::ip::tcp::socket> socket;
};
SocketServer.cpp
SocketServer::SocketServer(boost::asio::io_service &ioService) :
acceptor(ioService),
socket(new boost::asio::ip::tcp::socket(ioService)) {}
SocketServer::~SocketServer() {}
void SocketServer::StartAsync(int port)
{
boost::asio::ip::tcp::endpoint ep(boost::asio::ip::tcp::v4(), port);
acceptor.open(ep.protocol());
StartAccept();
}
void SocketServer::StopAsync()
{
acceptor.cancel();
}
void SocketServer::StartAccept()
{
acceptor.async_accept(*socket, std::bind(&SocketServer::HandleAccept, this));
}
void SocketServer::HandleAccept()
{
std::cout << "Connection accepted." << std::endl;
std::cout << "Connection accepted from " << socket->remote_endpoint().address().to_string() << std::endl;
// Will create a new thread here to process this connection
StartAccept();
}
这个想法是在给定的port 上接收多个连接请求,并为每个连接打开一个线程来处理。
问题是,即使没有连接,HandleAccept 也会被调用,并且 remote_endpoint 会抛出异常:
remote_endpoint: Bad file desciptor
我对发生的事情有点困惑。
我需要为每个连接调用一次,以便我可以使用给定的连接套接字启动一个线程。
一个附带问题:只使用一个套接字进行所有连接是正确的做法吗?
感谢您的帮助。
【问题讨论】:
标签: c++ multithreading sockets boost