yedf2 / handy

🔥简洁易用的C++11网络库 / 支持单机千万并发连接 / a simple C++11 network server framework
BSD 2-Clause "Simplified" License
4.56k stars 1.33k forks source link

udp为什么没有关心send缓冲区满的情况呢? #25

Closed happyxgang closed 7 years ago

happyxgang commented 7 years ago

在阅读代码的时候看到tcp在send缓冲区满的时候会把发送内容保存到对应的buffer里面去,并设置epoll的write标记等待可写的时候回调再次发送。 为什么对udp没有做这种操作呢?

dtm-labs commented 7 years ago

这个跟udp协议本身有关,调用udp的send,不会出现返回值为EAGAIN的情况,当udp的send被过于频繁的调用,底层协议不能够把所有数据都发送出去时,数据包会被直接丢弃。因此使用udp协议,需要自己做流控

happyxgang commented 7 years ago

tcp返回eagain的时候包可能只发送了部分,如果不在传输层做保存发送会让业务侧出现混乱。

而udp是整包一次性发送成功或失败,且本身协议不保证可靠传输。因此当整个包发送失败的情况下,直接交由业务来做流控更合理一些。

不知道这么理解合不合适。

dtm-labs commented 7 years ago

嗯嗯,是这个过程

happyxgang commented 7 years ago

多谢大大耐心回复