2

libssh2_channel_write_ex手册页:

实际写入的字节数或失败时的负数。LIBSSH2_ERROR_EAGAIN 否则会阻塞。虽然 LIBSSH2_ERROR_EAGAIN 是一个负数,但它本身并不是真正的失败。

现在我有一个问题。当我收到时LIBSSH2_ERROR_EAGAIN,这是否意味着什么都没有发送,我必须重新发送所有数据?还是表示已经发送了一些数据

我的问题是,如果我试图发送更多底层套接字可以保存的数据,write()无论如何都应该阻塞,从今以后我怎么能希望发送一大块数据而不是LIBSSH2_ERROR_EAGAIN每次都得到呢?

4

2 回答 2

3

LIBSSH2_ERROR_EAGAIN 如果没有发送数据且缓冲区中有数据,则会发生。您可以在使用 Select() 检查套接字是否处于活动状态后再次发送它。如果 Select() 返回事件,您可以适当地处理它并重新发送它。

循环是这样的

    do
    {
     While (rc = libssh2_Channel_write_ex () == LIBSSH2_ERROR_AGAIN )
     {
      if(!select()) // Wait for timeout
        //Timeout
     }
     if(rc>0)
      //Read next set of data into buffer for sending
     else if(rc <0)
      // Libssh2 error
    }
于 2012-03-21T18:57:44.627 回答
2

LIBSSH2_ERROR_EAGAIN 表示没有发送任何内容,您必须再次发送。如果发送了某些内容,则会返回该号码。

于 2011-05-18T18:06:43.437 回答