libssh2_channel_read阻塞调用不返回0的解决方案
在使用libssh2时,设置了 libssh2_session_set_blocking(session, 1);socket进入阻塞模式读写,此时调用int rc = libssh2_channel_exec(channel, sCmd); rc能正常返回0,此时读结束,这个只限于一次命令执行的结果。
想进行多个命令,长时的执行或者进入一种模式进行长时多命令操作就必须进入另一种模式就是申请一个虚拟终端,想使用虚拟终端pty,libssh2_channel_request_pty(channel,“xterm”); libssh2_channel_shell(channel); 调用之后进入虚拟shell模式。此时调用 libssh2_channel_exec libssh2会返回-39,操作无效。 这个情况只能使用libssh2_channel_write和libssh2_channel_read去执行命令。在执行的过程中会发现 while(nbytes = libssh2_channel_read(m_pChannelH2, (char*)buffer, sizeof(buffer))) > 0)会阻塞退不出来,因为此时无数据可读并不会返回0. 当然一些网络操作熟悉的可能就想到了用异步方式去处理。这里我们可以借鉴异步的处理模式来解决这个问题。
解决思路就是如果没有数据我们就不读,有数据才读。如果读超时也可以放弃当次数据,下次在执行命令时先清理socket的缓冲,就可以完美解决此方案。那么怎么判断有没有数据可读呢?libssh2给出了一种解决办法,libssh2_poll。
static int waitsocket(libssh2_socket_t socket_fd, LIBSSH2_SESSION *session)
{
struct timeval timeout;
int rc;
fd_set fd;
fd_set *writefd = NULL


2549

被折叠的 条评论
为什么被折叠?



