异步服务器不接受连接

asio async server not accepting connections

本文关键字:连接 不接受 服务器 异步      更新时间:2023-10-16

我创建了一个基于日间异步TCP服务器示例的异步服务器,但使用c++ 11而不是boost。下面是服务器类:

 class TcpServer {
  public:
    static std::shared_ptr<TcpServer> make(int port);
    ~TcpServer();
    void start();
  protected:
      TcpServer(int port);
      void init(int port);
      void createSession();
      void onConnect(std::vector<std::shared_ptr<TcpSession>>::iterator session_iter, const asio::error_code& error);
      asio::io_service mService;
      std::thread mServiceThread;
      asio::ip::tcp::acceptor mAcceptor;
      asio::ip::tcp::socket mSocket;
      asio::ip::tcp::endpoint mLocalEndpoint;
      std::vector < std::shared_ptr<TcpSession>> mSessions;
  };
std::shared_ptr<TcpServer> TcpServer::make(int port) {
    std::shared_ptr<TcpServer> Server(new TcpServer(port));
    return Server;
}
TcpServer::TcpServer(int port) : mSocket(mService), mAcceptor(mService) {
    init(port);
}
TcpServer::~TcpServer() {
    mSocket.cancel();
    mService.stop();
    if (mServiceThread.joinable()) {
        mServiceThread.join();
    }
}
void TcpServer::start() {
    createSession();
}
void TcpServer::init(int port) {
    mLocalEndpoint = asio::ip::tcp::endpoint(asio::ip::tcp::v4(), port);
    std::printf("TcpServer -- Creating endpoint %s:%d ...n", mLocalEndpoint.address().to_string().c_str(), mLocalEndpoint.port());
    mAcceptor.open(mLocalEndpoint.protocol());
    mAcceptor.set_option(asio::ip::tcp::acceptor::reuse_address(true));
    mAcceptor.bind(mLocalEndpoint);
    mAcceptor.listen();
    mServiceThread = std::thread([&] {
        mService.run();
    });
}
void TcpServer::createSession() {
    std::printf("TcpServer -- Creating new session...n");
    std::shared_ptr<TcpSession> newSession = TcpSession::make(mService);
    std::vector<std::shared_ptr<TcpSession>>::iterator iterator = mSessions.insert(mSessions.end(), newSession);
    mAcceptor.async_accept(newSession->getSocket(), 
      [this, iterator](const asio::error_code &error) {
      std::printf("Async Acceptn");
      onConnect(iterator, error);
    });
}
void TcpServer::onConnect(std::vector<std::shared_ptr<TcpSession>>::iterator session_iter, const asio::error_code& error) {
    if (!error) {
        std::printf("TcpServer -- Connection from %s received!n", (*session_iter)->getSocket().remote_endpoint().address().to_string().c_str());
    // Write a response
    //auto buff = std::make_shared<std::string>("Hello World!rnrn");
    //asio::async_write((*session_iter)->getSocket(), asio::buffer(*buff), 
    //  [this, session_iter](const asio::error_code &error, std::size_t bytesReceived) {
    //  onWrite(session_iter, error, bytesReceived);
    //});
    // begin listening
    //receive(session_iter);
}
else {
    std::printf("TcpServer::onConnect -- Error receiving data. %sn", error.message().c_str());
    mSessions.erase(session_iter);
}
}

然后是小TcpSession类:

class TcpSession {
    public:
        ~TcpSession();
        static std::shared_ptr<TcpSession> make(asio::io_service& service){
        asio::ip::tcp::socket& getSocket() {
            return mSocket;
        }
    protected:
        TcpSession(asio::io_service& service);
        asio::ip::tcp::socket mSocket;
    };

我创建了一个服务器实例,并像这样运行它:

void main() {
    mServer = TcpServer::make(8060);
    mServer->start();
}

我然后尝试连接到它与一个轻量级的TCP/IP应用程序,如TCP/IP生成器(Windows);然而,我从来没有看到任何来自onConnect的消息表明我已经建立了联系。

谁有什么建议可能是错的?

谢谢!

您的问题是asio::io_service::run()由于缺乏工作而立即返回。为了保持io_service运行,你应该创建一个io_service::work对象。

您的防火墙是否有可能阻塞进程/端口?