2

使用 libssh2 实现“从哪个通道首先读取数据”原语的推荐方法是什么?例如,我有一个简单的两选项卡终端程序,其中每个选项卡对应一个 LIBSSH2 通道。我想等到 2 个通道中的任何一个获得数据然后打印它。

单通道示例以非阻塞方式使用 libssh2_channel_read(),如下所示:

while(not done) {
    1.  Try reading with libssh2_channel_read()
    2.  If returned LIBSSH2_ERROR_EAGAIN, wait with select()
}

将此扩展到双通道情况的简单方法是:

while(not done) {
    1.  Try reading channel 1
    2.  Try reading channel 2
    3.  If BOTH channels returned LIBSSH2_ERROR_EAGAIN, wait with select()
}

当包含通道 1 的一些数据的数据包在读取通道 2 之前到达时,这会导致一个罕见的错误。然后两个调用都返回 LIBSSH2_ERROR_EAGAIN,但由于尝试读取通道 2 实际上是接收通道 1 的数据,因此选择( ) 现在将挂起。

我目前使用的解决方法包括为套接字保留原始数据计数器并使用它们来确定 libssh2 是否使用了任何新数据,但我觉得为一个相当简单的问题制定了一个非常复杂的解决方法。我错过了什么吗?是否有某种 libssh2_session_read_any_channel()?

4

0 回答 0