0

私はVS2010でデバッグしています。BIO_do_connect() は、次のコードで失敗します。私は何を間違っていますか?

(pBioは使用前に適切に設定されています)

static const uint32_t kuSleepIntervalInMs = 50;

...
uint32_t uTimeTaken = 0;
...

BIO_set_nbio(pBio, 1);

for (;;)
{
    if (uTimeTaken > 10000)
        return ERR_CONNECTION_TIMED_OUT;

    if (BIO_do_connect(pBio) > 0)
        break;

    if (BIO_should_retry(pBio))
    {
        Sleep(kuSleepIntervalInMs);

        uTimeTaken += kuSleepIntervalInMs;

        continue;
    }

    BIO_free_all(pBio);

    return ERR_FAILED_TO_ESTABLISH_CONNECTION;
}

スリープ間隔を (たとえば 500 に) 増やすと、BIO_do_connect は正常に動作するように見えますが、短い間隔値で失敗する理由を知りたいです。

4

1 に答える 1

0

元の質問を投稿して以来、select() を使用するように切り替えたため、問題は無効になりました。

する代わりに

uTimeTaken += kuSleepIntervalInMs;

私は今やっています:

int nRet;
int fdSocket;
fd_set connectionfds;
struct timeval timeout;

BIO_set_nbio(pBio, 1);

nRet = BIO_do_connect(pBio);

if ((nRet <= 0) && !BIO_should_retry(pBio))
    // failed to establish connection.

if (BIO_get_fd(pBio, &fdSocket) <= 0)
    // failed to get fd.

if (nRet <= 0)
{
    FD_ZERO(&connectionfds);
    FD_SET(fdSocket, &connectionfds);

    timeout.tv_usec = 0;
    timeout.tv_sec = 10;

    nRet = select(fdSocket + 1, NULL, &connectionfds, NULL, &timeout);
    if (nRet == 0)
        // timeout has occurred.
}

私の他の投稿を参照してください。

于 2013-04-16T12:07:14.007 に答える