Closed fortunely closed 2 years ago
How about:
void onConnection(const TcpConnectionPtr& conn)
{
if (conn->connected())
{
// ...
onWriteComplete(conn);
}
}
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
}
}
我想实现这样的效果: 传输一个文件,只在服务端onWriteComplete中进行读文件、修改内容、发送文件操作。 但是,如果在onConnection中不发送数据,就不会触发写完成事件,而回调onWriteComplete。如果要在onConnection中发送数据,那么读文件、修改内容、发送文件,类似的代码,可能需要在onConnection和onWriteComplete中都写一遍。
具体问题点:muduo能否触发虚拟事件,比如写完成事件,进而回调onWriteComplete,但过程中并不真正向对端发送任何数据内容? 例如,Libevent可以通过bufferevent_trigger,在connection事件中触发写完成事件,而无需真正发送数据。
bufferevent_trigger(bev, EV_WRITE, 0);