当通道未阻塞时libssh2_channel_write的行为

时间:2011-03-25 10:46:17

标签: c sockets nonblocking libssh2

来自libssh2_channel_write_ex手册页:

  

写入的实际字节数或   失败时消极。   LIBSSH2_ERROR_EAGAIN什么时候会   否则阻止。而   LIBSSH2_ERROR_EAGAIN是否定的   数字,这不是真的失败   本身。

现在我遇到了问题。当我收到LIBSSH2_ERROR_EAGAIN时,是否表示没有发送任何内容,我必须重新发送所有数据?或者是否意味着已经发送了一些数据

我的问题是,如果我正在尝试发送底层套接字可以容纳的更多数据,write()无论如何都应该阻止,从此我怎么能希望在不获取{{1}的情况下发送大块数据每一次?

2 个答案:

答案 0 :(得分: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
    }

答案 1 :(得分:2)

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