提升ASIO TCP,为什么我不能在服务器端只有一个数据套接字可以打开和关闭
Boost asio tcp, why cant I have only one data socket on the server side that can be opened and closed
简而言之,我的问题是,如果您有一个只有一个活动连接的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 必须支持多个并发连接,因此这就是决定实现的设计要求。为了实现"只有一个"情况,只需在成功接受新连接并以后重新打开后,只需关闭侦听器插座即可。通常不值得努力。
您描述的开销很少,不值得尝试优化。
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- WTSEnumerateProcesses与套接字和数据结构
- 在 1 个服务器 n 客户端套接字 C++ MFC 应用程序中更新数据的客户端
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- 我们可以在套接字编程中将自定义数据作为辅助数据发送吗?
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- 尝试将数据从C++发送到 Python 并使用套接字C++反转,C++ sendto() 和 python recvfr
- 不要从输入队列套接字读取数据
- 通过套接字 c++ 发送长度和数据
- 如何读取套接字编程(c ++)中的所有数据?
- 使用 Broadcast 发出的从节点服务器发送的数据不能被 C++ 套接字 IO 客户端读取
- 无法通过套接字发送或接收数据
- 连接UDP套接字,但仍然接收来自其他源的数据报
- boost::asio-async_read_some示例代码没有读取套接字中的所有数据
- 使用 epoll 边缘触发器的套接字上的数据过多
- 为什么 sys 套接字 recv 函数不填充数据但返回字节长度?
- 将空数据写入非阻塞套接字会导致epoll_wait挂起
- C++ 套接字 - 发送 - 未收到数据
- 通过套接字发送的自定义数据包
- 无法在java(客户端)的套接字上正确写入数据(类),也无法在c ++(服务器)上读取数据(类)