提升ASIO TCP,为什么我不能在服务器端只有一个数据套接字可以打开和关闭

Boost asio tcp, why cant I have only one data socket on the server side that can be opened and closed

本文关键字:套接字 数据 有一个 TCP ASIO 为什么 服务器端 不能 提升      更新时间:2023-10-16

简而言之,我的问题是,如果您有一个只有一个活动连接的TCP服务器,您只能创建一个服务器端数据套接字。在所有教程中,我看到创建了一个新的插座,我不明白为什么必须是这种情况。为什么不创建一个服务器端套接字,然后打开,关闭,重置它(我最初希望Async_accept以某种方式这样做)?

更详细地:

我已经完成了Boost ASIO教程,以获取异步的日期服务器,并且可以使其编译和工作。我甚至可以为我的应用程序修改它,并按照我的要求运行:)。但是,我最初的方法不起作用,我不明白为什么我希望得到您的帮助。

基本上,我想创建一个只能接受一个TCP客户端并忽略所有其他客户端的TCP服务器,除非第一个客户端断开连接。我使用accceptor.close()和acccorpor.open()这样做了,这样当第一个连接被接受时,我才关闭了受体,然后每当我选择eof错误时,我都会重新打开受体来收听新连接。我天真地认为,因为我只想要一个主动连接,所以我只需要创建一个:

boost::asio::ip::tcp::socket socket_

我只有一个数据插座从客户端接收数据,根据教程,创建整个TCP_Connection类似乎过于杀伤,据我所知,我只返回了用io_service构建的新套接字。(在教程中,我认为每当服务器接受新连接时,都会使用此代码创建新的套接字):

class tcp_connection
  : public boost::enable_shared_from_this<tcp_connection>
{
 public:
  typedef boost::shared_ptr<tcp_connection> pointer;
  static pointer create(boost::asio::io_service& io_service)
  {
    return pointer(new tcp_connection(io_service));
  }
  tcp::socket& socket()
  {
    return socket_;
  }

 private:
  tcp_connection(boost::asio::io_service& io_service)
    : socket_(io_service)
  {
  }
  tcp::socket socket_;
  std::string message_;
};

因此,我尝试仅使用一个boost :: asio :: ip :: tcp :: socket。我使用IO_Service以与上面的教程相似的方式在服务器类的构造函数中初始化了此功能。我的测试表明,我的第一个客户端将连接,并且只有在第一个客户断开连接后才连接。但是,无论我在async_accept上做了什么数据缓冲区(套接字_,.....)呼叫永远不会填充。最初,我只是继续遇到EOF错误,然后我尝试关闭袜子并重新打开,以删除EOF错误,并给出了运输端未连接的错误。显然,我在这里做一些非常愚蠢的事情,但我看不到哲学上的错误,我想做什么。当我使用教程技术创建新的插座时,一切都按预期工作。

所以我的问题是我可以只有一个插座,然后做诸如取消,关闭,打开的事情吗?我打算绑定还是其他东西,但不是Async_accept作业吗?

我现在只使用Boost Asio一个星期,这是我有史以来的第一个论坛上的第一个帖子,所以请轻松;)。

您可以,但是您不能。

没有理由无法按照您的说明实施TCP,但我知道没有操作系统这样做。

原因很简单,因为OS 必须支持多个并发连接,因此这就是决定实现的设计要求。为了实现"只有一个"情况,只需在成功接受新连接并以后重新打开后,只需关闭侦听器插座即可。通常不值得努力。

您描述的开销很少,不值得尝试优化。