2011-03-25 8 views
1

libssh2_channel_write_ex 매뉴얼 페이지에서 :채널이 차단되지 않을 때 libssh2_channel_write의 동작

실패시 실제 기록 된 바이트 수 또는 음수입니다. LIBSSH2_ERROR_EAGAIN 그렇지 않으면 을 차단합니다. LIBSSH2_ERROR_EAGAIN은 음수 숫자이지만 실제로는 se 당 실패하지 않습니다.

이제 문제가 생겼습니다. LIBSSH2_ERROR_EAGAIN을받을 때 아무 것도 전송되지 않고 모든 데이터를 다시 보내야한다는 의미입니까? 또는 일부 데이터가 전송되었음을 의미합니까?

내 문제는 기본 소켓이 보유 할 수있는 더 많은 데이터를 보내려고하면 write()이 어쨌든 차단되어야한다는 것입니다. 이후로 어떻게하면 큰 블록을 보낼 수 있습니까? 매번 LIBSSH2_ERROR_EAGAIN하지 않고 데이터?

+0

같이 간다? – sarnold

+0

@sarnold : 사실 저는 엄청난 양의 데이터를 보내려고하고 있지 않지만 한 번에 여러 개의 열린 채널에 데이터를 보내고 있습니다. 모든 채널 버퍼 크기의 합이 기본 소켓 버퍼 크기보다 작아야한다는 것을 의미해야합니까? – kriss

+0

I _think_ 커널 전송 버퍼를 초과하면 (즉,'write (2)'는 전달한 버퍼의 길이보다 작은 값을 반환합니다) 짧은 쓰기 만하면됩니다. 따라서 모든 " 잠재적 인 짧은 글을 준비하기 위해 코드를 작성한 경우 "그냥 작동"하십시오. 하지만 전에 libssh2 라이브러리를 사용 해 본 적이 없으며, 필자는 libssh2 라이브러리가 무엇을 할지를 충분히 확신하지 못했습니다. :) 당신이 보낸 최대 블록이 32k라면, 버퍼가 한 개의'write (2)'에서 처리 할만큼 충분히 큰지 확인하십시오. – sarnold

답변

1

LIBSSH2_ERROR_EAGAIN은 아무 것도 보내지 않았다는 것을 의미하므로 다시 보내야합니다. 이 전송 된 경우 해당 번호가 대신 반환됩니다.

1

LIBSSH2_ERROR_EAGAIN 버퍼에 데이터가 전송되지 않은 경우 발생합니다. Select()를 사용하여 소켓이 있는지 여부를 확인한 후 다시 보낼 수 있습니다. Select()가 이벤트를 반환하면 적절하게 처리하고 다시 보낼 수 있습니다.

루프는 데이터의 거대한 덩어리를 전송하기 전에 소켓 (2)``setsockopt를 가진`SO_SNDBUF`를 사용할 수이

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 
    } 
관련 문제