2011-09-03 96 views
1
while(1) 
{ 
    read_blocked_on_write=0; 

    const int buff_len = 1024; 
    char buff[buff_len]; 

    iResult = SSL_read(ssl, buff, buff_len); 

    int ssl_err = SSL_get_error(ssl, iResult); 
    if(ssl_err == SSL_ERROR_NONE) 
    { 
     if(offset + iResult > recvbuflen - 1) 
     { 
      FD_ZERO(&fdread); 
      FD_ZERO(&fdwrite); 
      MessageBox(hwnd, TEXT("ERROR"), TEXT("Not enough memory!"), MB_OK | MB_ICONERROR); 
      return 1; 
     } 
     memcpy(recvbuf + offset, buff, iResult); 
     offset += iResult; 
     if(SSL_pending(ssl)) 
     { 
      continue; 
     } 
     else 
     { 
      bFinish = true; 
      break; 
     } 
    } 
    else if(ssl_err == SSL_ERROR_ZERO_RETURN) 
    { 
     bFinish = true; 
     break; 
    } 
    else if(ssl_err == SSL_ERROR_WANT_READ) 
    { 
     break; 
    } 
    else if(ssl_err == SSL_ERROR_WANT_WRITE) 
    { 
     /* We get a WANT_WRITE if we're 
     trying to rehandshake and we block on 
     a write during that rehandshake. 

     We need to wait on the socket to be 
     writeable but reinitiate the read 
     when it is */ 
     read_blocked_on_write=1; 
     break; 
    } 
    else 
    { 
     FD_ZERO(&fdread); 
     FD_ZERO(&fdwrite); 
     MessageBox(hwnd, TEXT("ERROR"), TEXT("SSL problem!"), MB_OK | MB_ICONERROR); 
     return 1; 
    } 
} 

回答

1

我不是ssl專家,但很可能是因爲沒有什麼可讀的。您正在讀取並移動一個緩衝區(最多需要幾毫秒),然後終止,如果在該時刻沒有更多內容需要讀取。同時你正在處理較低層的網速和解密速度。在那個時刻沒有什麼東西可以歸還,這不是不可能的。

爲什麼在那裏檢查?如果你正在嘗試多路複用或者其他什麼,否則不會以非阻塞的方式打開套接字?

+0

我設法通過添加一個select()else語句的SSL_pending(ssl)來解決它。它起作用了,但是在最後一次收到後,它會等待超時值到期。有沒有更好的方法來解決它? –

+1

@Saleh Hamadeh - 這證實了這個問題,但如果我明白你做了什麼,這不是一個很好的解決辦法 - 你只是擴大了超時的時間範圍。如果你願意阻止,爲什麼要使用SSL_pending?只需循環回讀,並在那裏阻止。當沒有更多的數據時,SSL_read應該返回0,它看起來好像你有已經編碼的檢查。整個SSL_pending條件對於你想要完成的事情來說是不必要的。 – Duck

相關問題