Closed umiro closed 2 years ago
我认为这应该是一个实现错误
根据约定,这里应该返回 Ok(0)
Poll::Ready(Ok(())) means that data was immediately read and placed into the output buffer. The amount of data read can be determined by the increase in the length of the slice returned by ReadBuf::filled. If the difference is 0, EOF has been reached.
或许可以在这里把状态切换到Closed
?
https://github.com/nervosnetwork/tentacle/blob/master/yamux/src/stream.rs#L180-L190
接受pr吗?我晚点可以试试修一下。
看了下Spec和Go的实现,收到FIN后需要再发一个FIN回去,那应该在这里将Ok(0)
传播出poll_read
就行了。
或许可以在这里把状态切换到Closed? https://github.com/nervosnetwork/tentacle/blob/master/yamux/src/stream.rs#L180-L190
这个是错的,yamux 有半关状态,直接切换是不行的
接受pr吗?我晚点可以试试修一下。
当然接受,如果有兴趣的话可以尝试一下,需要带上一个测试用例,类似这个 https://github.com/nervosnetwork/tentacle/blob/19907a9efbcf4d9a0e5e6c3ddc96f91a33cc3c9f/yamux/src/stream.rs#L541
看了下Spec和Go的实现,收到FIN后需要再发一个FIN回去,那应该在这里将Ok(0)传播出poll_read就行了。
对,修法很简单,将这个函数拆开,在 RemoteClosing 的分支直接返回 Poll(Ok(())
就可以了
可能与 #205 有关。
我用
io::copy
转发数据,发现StreamHandle
在另一端调用shutdown
后read
总是返回一个unexpectedeof
,但Tokio的TcpStream
在这种情况下返回Ok(0)
,io::copy
也依赖该行为,是有意这样设计的吗?测试代码-yamux 测试代码-tokio