最近在使用libuv作为服务端时,在某些环境下出现了发送数据不全的问题,例如单次发送50K数据,实际只能接收到45K,而且后续所有数据都无法被接收到。查了很久,后来发现在客户端主动发送一条数据,这样能触发libuv的剩余发送。
应用:
libuv做服务端,客户端连接后,当服务端有某些事件后向客户端推送一些数据。
现象:
单帧50K数据,无法收到结果,并且发现只有第一次发送会有部分数据,但数据不全。在相同环境中必现且现象一致。
在某些环境下出现,出现这种情况下接了无线路由和USB无线网卡。
排查:
经抓包和代码调试,发现服务端第一次发送的数据与实际接收到的数据是一致的,并且通过抓包确认后续数据都没有发送。
这与 uv__try_write 第一次发送后返回的 n 对应一致。
随后将更新剩余数据,剩余数据长度与未发送数据长度一致。
接下来调用uv_io_start,试图将写事件加入到epoll里。
再接下来继续发送数据时在 uv_write2 中由于
条件不满足进入到else发送,这与代码原注释也相吻合,