gpt4 book ai didi

c++ - 为什么这个函数是false,来自TCP服务器 session 类成员socket_.is_Open

转载 作者:行者123 更新时间:2023-11-28 02:15:47 25 4
gpt4 key购买 nike

观察

我根据这个server构建了一个演示应用程序在我使用 C++11 std 替换原先在 boost 中的所有内容后使用 ASIO 的示例。服务器可以显示类成员 tcp_session::start() 仅在客户端连接后被调用,这是服务器接受来自客户端的连接的良好指示。

但是,当客户端发送大量数据时,我没有看到 handle_read 收到任何东西。最后,我发现 stopped() 始终为真,这意味着 socket_.isOpen 为假。

问题:

所以我想知道是否需要做任何事情来将 socket_ 设置为 start() 中的 isOpen,或者 socket_ 应该自动“打开”(表示已连接)?还是我的理解或假设有误?

我正在使用 VS2015 并在本地主机上进行测试。

可能性:

我将默认的 30 秒超时更改为 1 秒。那么在服务器连接上的时候,在客户端发送数据之前,有没有可能是服务器超时关闭了socket呢?

更新

我在 handle_read 中得到一些 std::cout 并停止。我现在将超时设置为 6 秒并发现:客户端连接后立即调用 start,然后没有任何迹象表明调用了 handle_read,但 6 秒后,stop() 被调用调用,然后调用 handle_read

我猜 handlers 配置有误。

发现

然后我发现如果我将 async_read 更改为我最初评论的 async_read_until ,那么 handle_read 将继续,因为 socket_.isopen 为真。

因此,结论是,async_read获取不到handle_read被调用,而async_read_until可以,这就变成了another question . socket_.is_open() 在超时停止 session 之前为真。

下面是一些相关的代码:

class tcp_session : public subscriber, public  std::enable_shared_from_this<tcp_session> {
public:
void start() {
std::cout<<"started"<<std::endl;
channel_.join(shared_from_this());
start_read();
input_deadline_.async_wait(
std::bind(&tcp_session::check_deadline, shared_from_this(), &input_deadline_)
);
await_output();

output_deadline_.async_wait(
std::bind(&tcp_session::check_deadline, shared_from_this(), &output_deadline_)
);
}
private:
bool stopped() const {
return !socket_.is_open();// weird that it is still not open
}
void start_read() {

// Set a deadline for the read operation.
input_deadline_.expires_from_now(timeout_); //was std::chrono::seconds(30) in example
char a = 0x7F;
// Start an asynchronous operation to read a 0x7F-delimited message or read all
//asio::async_read_until(socket_, input_buffer_, a, std::bind(&TCP_Session::handle_read, shared_from_this(), std::placeholders::_1));

asio::async_read(socket_, input_buffer_,
std::bind(&TCP_Session::handle_read, shared_from_this(), std::placeholders::_1));
}
void handle_read(const asio::error_code& ec) {
if (stopped()) // it thinks it stopped and returned without processing
return;

最佳答案

打开的套接字不暗示其连接状态,连接状态不影响套接字的打开或关闭状态。两者之间的唯一保证是关闭的套接字没有连接。

示例客户端流程:

using boost::asio::ip::tcp;
tcp::socket socket(io_service); // closed state -- no connection
socket.open(...); // opened state -- no connection
socket.bind(...);
socket.connect(...); // opened state -- connection
... connection established ...
... remote peer terminates/closes connection ... // opened state -- no connection
assert(socket.is_open());
socket.close(); // closed state -- no connection
assert(!socket.is_open());

示例服务器流程:

using boost::asio::ip::tcp; 
tcp::acceptor acceptor_(io_service); // acceptor closed state
acceptor.open(...); // acceptor opened state
acceptor.bind(...);
acceptor.listen(); // acceptor listening state

tcp::socket socket(io_service); // closed state -- no connection
acceptor.accept(socket); // opened state -- connection
... connection established ...
... remote peer terminates/closes connection ... // opened state -- no connection
assert(socket.is_open());
socket.close(); // closed state -- no connection
assert(!socket.is_open());

assert(acceptor.is_open();
acceptor.close(); // acceptor closed state
assert(!acceptor.is_open());

在您的服务器中,由于 socket_.is_open() 返回 false,因此在套接字上显式调用了 socket_.close()tcp_session::stop() 中。要更深入地了解调用它的原因,请考虑:

  • 定义 BOOST_ASIO_ENABLE_HANDLER_TRACKING 以启用 handler tracking .定义后,Boost.Asio 将有关异步操作和处理程序关系的信息写入标准错误流。
  • 附加调试器并在 tcp_session::stop() 中设置断点。

关于c++ - 为什么这个函数是false,来自TCP服务器 session 类成员socket_.is_Open,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34079827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com