chenshuo / muduo

Event-driven network library for multi-threaded Linux server in C++11
https://github.com/chenshuo/muduo
Other
14.7k stars 5.15k forks source link

能否触发虚拟事件,比如写完成事件? #550

Closed fortunely closed 2 years ago

fortunely commented 2 years ago

我想实现这样的效果: 传输一个文件,只在服务端onWriteComplete中进行读文件、修改内容、发送文件操作。 但是,如果在onConnection中不发送数据,就不会触发写完成事件,而回调onWriteComplete。如果要在onConnection中发送数据,那么读文件、修改内容、发送文件,类似的代码,可能需要在onConnection和onWriteComplete中都写一遍。

具体问题点:muduo能否触发虚拟事件,比如写完成事件,进而回调onWriteComplete,但过程中并不真正向对端发送任何数据内容? 例如,Libevent可以通过bufferevent_trigger,在connection事件中触发写完成事件,而无需真正发送数据。 bufferevent_trigger(bev, EV_WRITE, 0);

chenshuo commented 2 years ago

How about:

void onConnection(const TcpConnectionPtr& conn)
{
  if (conn->connected())
  {
    // ...
    onWriteComplete(conn);
  }
}
fortunely commented 2 years ago

How about:

void onConnection(const TcpConnectionPtr& conn)
{
  if (conn->connected())
  {
    // ...
    onWriteComplete(conn);
  }
}

感谢回复。这样可以将工作都交给onWriteComplete来做,不过会在onConnection中的调用写完数据后,还会再次触发一次onWriteComplete。 而我的程序希望在第一次fread文件返回0byte时,就会根据ferror/feof的结果来决定向客户端发送指定消息,以关闭数据连接。读完file,就需要两次进入onWriteComplete,可能会导致发送2次同样的应答给客户端。除非为连接再额外设置一个状态标志,表示是否已经发送过1次响应。

我试过直接发送空字符串"",似乎有效,不在onConnection中从文件读取数据,也不发送数据,可以触发一次onWriteComplete。

void onConnection(const TcpConnectionPtr& conn)
{
    // ...
    if (conn->connected()) {
        // ...
        conn->send(""); // trigger write complete event
    }
    else { // disconnect
    }
}