일부 SFTP 작업을 수행하기 위해 가장 최근의 libssh2 Git 트리를 사용하고 있습니다. 비 차단 인터페이스를 사용하고 있습니다.libssh2 SFTP 차단 호출 진단
SFTP 서버 연결, 로그인 및 파일 전송에 성공했습니다.
그러나 libssh2_sftp_write(sftp_handle, ptr, nread)
전화가 끊기는 문제가 발생합니다. 이 은 항상이고 237115172 바이트의 데이터가 전송 된 후에 발생합니다.
페이로드가이 숫자보다 작 으면 모든 것이 잘 진행됩니다.
여러 파일을 전송 중입니다. 전체 트랜잭션에 단일 SSH 세션 (및 단일 소켓)을 사용하고 있습니다. 누구든지이 문제를 해결하기위한 방향을 제시 할 수 있습니까? 매직 넘버 237115172는 힌트이지만, 나에게 아직 의미가 없습니다. 나는 무엇을 잘못 할 수 있 었는가?
이do
{
nread = fread(m_buffer, 1, sizeof(m_buffer), local);
//
// EOF
//
if (nread <= 0)
break;
ptr = m_buffer;
total += nread;
do
{
//
// FIXME: this hangs sometimes... why?!
//
/* write data in a loop until we block */
while
(
(rc = libssh2_sftp_write(sftp_handle, ptr, nread))
==
LIBSSH2_ERROR_EAGAIN
)
{
if (m_aborted)
goto cleanup;
waitsocket(m_sock, m_session);
}
if (rc < 0)
break;
ptr += rc;
nread -= rc;
m_uploadedBytes += rc;
emit totalUploadChanged(100*(float)m_uploadedBytes/m_totalBytes);
}
while (nread);
}
while (rc > 0);
I의 전체 소스를 게시 할 수 있지만, 그것은 매우 긴, 그리고 그것이 QT 응용 프로그램의 일부이기 때문에 그것은 노력의 조금 걸릴 것 :
이 똑바로 libssh2 예에서, 코드입니다 꺼내기.
m_buffer의 크기는 얼마입니까? –
@ 존 Zwinck : 그것은'char m_buffer [1024 * 100];으로 정의됩니다. – misha
그것은 종달새에 25K로 만들어보십시오. 나는 버퍼가 32KB 이상일 때만 발생하는 libssh2에 이상한 문제가있었습니다. 정확한 이유를 모르겠다. (나는 잊어 버렸던 몇 가지 힌트를 발견했다.) 그러나 그것은 도서관에서 어떤 종류의 버그였다. 내 버퍼를 31KB로 변경하고 영원히 일했습니다. –