c - channel 未阻塞时 libssh2_channel_write 的行为

标签 c sockets nonblocking libssh2

来自 libssh2_channel_write_ex 手册页:

Actual number of bytes written or negative on failure. LIBSSH2_ERROR_EAGAIN when it would otherwise block. While LIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.

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

我的问题是,如果我尝试发送底层套接字可以容纳的更多数据,write() 无论如何都应该阻塞,今后我如何希望在不发送大数据 block 的情况下发送大数据 block 每次都得到LIBSSH2_ERROR_EAGAIN

最佳答案

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
    }

关于c - channel 未阻塞时 libssh2_channel_write 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5431392/

相关文章:

c++ - 在 C++ 中通过套接字发送 protobuf 的序列化是什么?

tcp - 给定 TCP,当 IO 是非阻塞时,State Design Pattern 是否用处不大?

linux - 为什么非阻塞 TCP connect() 在 Linux 上偶尔会这么慢?

c - STM32人工智能

c++ - 为什么我可以更改数组

c++ - 如何避免重复使用socket?

php - UNIX 域套接字服务器和客户端不能双向通信

java - 使用 ColdFusion 的简单 TCP/IP 套接字通信

javascript - 使用alertify.js 进行递归会导致自动关闭警报

c - Oracle OCI - 以另一个用户身份运行时失败并出现 ORA-12705