C-如何使用OpenSSL';s BIO_write()是否正确

C-如何使用OpenSSL';s BIO_write()是否正确,c,network-programming,openssl,C,Network Programming,Openssl,我是OpenSSL新手。我知道BIO_write(BIO*b,const void*buf,int len)需要在循环中调用,但我不能完全确定是否正确使用了它。我编写了这样一个函数: int32_t SendPacket(BIO * const pBio, const unsigned char * const pPacket, const int nPacketLength) { int32_t nPos = 0; if (!pBio || !pPacket || !nPac

我是OpenSSL新手。我知道BIO_write(BIO*b,const void*buf,int len)需要在循环中调用,但我不能完全确定是否正确使用了它。我编写了这样一个函数:

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.
}
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;
}

这个函数看起来正确吗?感谢您的反馈。

在我的原始帖子中,我在重试BIO_write()时没有将“nNumberOfBytes”重置为0

我最后做了这样的事情:

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.
}
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;
}
int32\u t SendPacket(BIO*const pBio,const unsigned char*const pPacket,const int32\u t npackletlength)
{
int32_t nPos=0;
int32_t n写入的字节数=0;
...
对于(nPos=0;nPosif((nNumberOfBytesWrite=BIO_write(pBio,pPacket+nPos,pPacketLength-nPos))函数看起来不错。你有没有遇到任何问题?除了pPacketLength不应该是-1。在我的应用程序中,BIO_写入块需要1或2分钟。你知道吗?