#define MAX_SEGMENT_SIZE 32768 ....CUT...... libssh2_session_set_blocking(myssh_session, 0); do { do { char mem[MAX_SEGMENT_SIZE]; if (tbd < MAX_SEGMENT_SIZE) get_this = tbd; else get_this = MAX_SEGMENT_SIZE; rc = libssh2_sftp_read(mysftp_handle, mem, get_this); if (rc > 0) { printf ("Got %d bytes",rc); fflush (NULL); tbd = tbd - rc; rwr = fwrite(mem, rc , 1,stream); if (rwr != 1) { // Local filesystem error - return immediately fclose (stream); return SSHREAD_ERRORWRITINGLOCAL; } } if ( tbd == 0) break; } while (rc > 0 ); if (tbd == 0) break; //end of download if (rc != LIBSSH2_ERROR_EAGAIN) { fclose (stream); switch (rc) { case LIBSSH2_ERROR_ALLOC : retu = SSHREAD_INTERNAL_ALLOC_ERROR; break; case LIBSSH2_ERROR_SOCKET_SEND: retu = SSHREAD_FAILED_SEND; break; case LIBSSH2_ERROR_SOCKET_TIMEOUT: retu = SSHREAD_TIMED_OUT; break; case LIBSSH2_ERROR_SFTP_PROTOCOL: retu = SSHREAD_INVALIDRESPONSE; break; default: retu = SSHREAD_GENERIC; break; } break; } my_timeout.tv_sec = 10; my_timeout.tv_usec = 0; FD_ZERO(&myfd); FD_SET(my_sock, &myfd); /* wait for readable or writeable */ rc = select(my_sock+1, &myfd, &myfd, NULL, &my_timeout); if(rc <= 0) { fclose (stream); retu = SSHREAD_TIMEOUTRESPONSE; break; } } while (1); // End of second do