ZLMediaKit/ZLToolKit

In `test_udpSock`, if `try_flush` is not enforced when sending, the message will not be sent.

dongdan002 opened this issue · 3 comments

在 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);
}

sendSock在发送的时候设置try_flush为false,消息发送不出去。

这是预期行为 就是这么设计的 用户需要再调一次flushAll接口才行

这样设计的初衷是批量发送提高性能

好的,了解了,多谢解答