2011-11-12 3 views
0

일부 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 예에서, 코드입니다 꺼내기.

+0

m_buffer의 크기는 얼마입니까? –

+0

@ 존 Zwinck : 그것은'char m_buffer [1024 * 100];으로 정의됩니다. – misha

+0

그것은 종달새에 25K로 만들어보십시오. 나는 버퍼가 32KB 이상일 때만 발생하는 libssh2에 이상한 문제가있었습니다. 정확한 이유를 모르겠다. (나는 잊어 버렸던 몇 가지 힌트를 발견했다.) 그러나 그것은 도서관에서 어떤 종류의 버그였다. 내 버퍼를 31KB로 변경하고 영원히 일했습니다. –

답변

0

두 버전의 libssh2가 설치되어있는 것으로 나타났습니다. 1.2.2./usr 및 1.3.0 (자식 저장소에서)/usr/local에 있습니다. 특정 버전에 대한 첨부 파일이 없으므로 최신 버전을 제거했습니다 (이전 버전은 내 컴퓨터의 다른 소프트웨어에 대한 종속성이었습니다).

이전 인터페이스에 맞게 2 ~ 3 가지 작은 변경을해야했지만 원래 질문에 설명 된 문제는 사라졌습니다.

+0

버전 1.2.2는 2 년 8 버전이 오래되었습니다. 1.3.0 버전을 사용해보고 더 잘 작동하는지 확인하십시오. libssh2 버전 1.5는 없습니다. – Dan

+0

@ Dan : 내 나쁜 버전은 Git repo에서 1.3.0입니다. 나는 내 직책을 수정했다. – misha