2013-01-11 225 views
3

我是OpenSSL的新手。我知道需要在循环中调用BIO_write(BIO * b,const void * buf,int len),但我不完全确定是否正确使用它。我已经写了这样的功能:C - 如何正确使用OpenSSL的BIO_write()

int32_t SendPacket(BIO * const pBio, const unsigned char * const pPacket, const int nPacketLength) 
{ 
    int32_t nPos = 0; 

    if (!pBio || !pPacket || !nPacketLength) 
     return -1; 

    while (nPos < nPacketLength) 
    { 
     int32_t nNumberOfBytesWritten = BIO_write(pBio, &pPacket[nPos], nPacketLength - nPos); 
     if (nNumberOfBytesWritten <= 0) 
     { 
      if (!BIO_should_retry(pBio)) 
       return -1; 
     } 
     else 
     { 
      nPos += nNumberOfBytesWritten; 
     } 
    } 

    return nPos; 
} 

而且我想使用它像这样的:

if (SendPacket(pBio, pPacket, nPacketLength) == nPacketLength) 
{ 
    // Packet sent correctly. 
} 
else 
{ 
    // Error occurred. 
} 

是否功能看起来是正确的?任何反馈意见。

+0

功能看起来不错。你有没有遇到任何问题? – doptimusprime

+0

除nPacketLength不应该是-1。 – doptimusprime

回答

6

在我原来的文章中,我没有在重试BIO_write()时将“nNumberOfBytesWritten”重置为0。

最后我做这样的事情:

int32_t SendPacket(BIO * const pBio, const unsigned char * const pPacket, const int32_t nPacketLength) 
{ 
    int32_t nPos = 0; 
    int32_t nNumberOfBytesWritten = 0; 
    ... 
    for (nPos = 0; nPos < nPacketLength; nPos += nNumberOfBytesWritten) 
    { 
     if ((nNumberOfBytesWritten = BIO_write(pBio, pPacket + nPos, nPacketLength - nPos)) <= 0) 
     { 
      if (BIO_should_retry(pBio)) 
      { 
       nNumberOfBytesWritten = 0; 
       continue; 
      } 

      return -1; 
     } 
    } 

    return nPos; 
}