In `test_udpSock`, if `try_flush` is not enforced when sending, the message will not be sent.
dongdan002 opened this issue · 3 comments
dongdan002 commented
在 test_udpSock.cpp 测试代码中,sendSock在发送的时候设置try_flush为false,消息发送不出去。
//每隔一秒往对方发送数据
// sockSend->send(to_string(i++), (struct sockaddr *)&addrDst);
//修改为非强制刷新
try_flush = false;
sockSend->send(to_string(i++), (struct sockaddr *)&addrDst, 0, try_flush);
原因为:
当发送缓冲区为空的时候,poller线程会修改监听fd,关掉写,stopWriteAbleEvent()
但是startWriteAbleEvent()只会在非poller线程中触发,又没有其他操作来修改fd的event。导致在select时候,fd没有write事件
if (!poller_thread) {
@mtdxc // 如果该函数是poller线程触发的,那么该socket应该已经加入了可写事件的监听<实际并没有加进去>,所以我们不需要再次加入监听
startWriteAbleEvent(sock);
}
xia-chu commented
sendSock在发送的时候设置try_flush为false,消息发送不出去。
这是预期行为 就是这么设计的 用户需要再调一次flushAll接口才行
xia-chu commented
这样设计的初衷是批量发送提高性能
dongdan002 commented
好的,了解了,多谢解答