Example #1
0
int RecvSocketStream(int sd, char buffer[CF_BUFSIZE], int toget, int nothing)
{
    int already, got;

    CfDebug("RecvSocketStream(%d)\n", toget);

    if (toget > CF_BUFSIZE - 1)
    {
        CfOut(cf_error, "", "Bad software request for overfull buffer");
        return -1;
    }

    for (already = 0; already != toget; already += got)
    {
        got = recv(sd, buffer + already, toget - already, 0);

        if ((got == -1) && (errno == EINTR))
        {
            continue;
        }

        if ((got == -1) && (LastRecvTimedOut()))
        {
            CfOut(cf_error, "recv", "!! Timeout - remote end did not respond with the expected amount of data (received=%d, expecting=%d)",
                  already, toget);
            return -1;
        }

        if (got == -1)
        {
            CfOut(cf_error, "recv", "Couldn't recv");
            return -1;
        }

        if (got == 0)           /* doesn't happen unless sock is closed */
        {
            CfDebug("Transmission empty or timed out...\n");
            break;
        }

        CfDebug("    (Concatenated %d from stream)\n", got);
    }

    buffer[already] = '\0';
    return already;
}
Example #2
0
/**
 * @brief Receive up to #toget bytes, plus a '\0', into buffer from sd.
 * @param sd Socket descriptor
 * @param buffer Buffer into which to read data
 * @param toget Number of bytes to read; a '\0' shall be written after
 *        the data; buffer must have space for that.
 * @return -1 on error; or actual length read.
 */
int RecvSocketStream(int sd, char buffer[CF_BUFSIZE], int toget)
{
    int already, got;

    if (toget > CF_BUFSIZE - 1 || toget < 0)
    {
        Log(LOG_LEVEL_ERR, "Bad software request to receive %d bytes", toget);
        return -1;
    }

    for (already = 0; already < toget; already += got)
    {
        got = recv(sd, buffer + already, toget - already, 0);

        if (got == -1)
        {
            if (errno == EINTR)
            {
                continue;
            }
            else if (LastRecvTimedOut())
            {
                Log(LOG_LEVEL_ERR,
                    "Timeout - remote end did not respond with the expected amount of data (received=%d, expecting=%d). (recv: %s)",
                    already, toget, GetErrorStr());
            }
            else
            {
                Log(LOG_LEVEL_ERR, "Couldn't receive. (recv: %s)", GetErrorStr());
            }
            return -1;
        }
        else if (got == 0) /* doesn't happen unless sock is closed */
        {
            break;
        }
    }
    assert(already <= toget);

    buffer[already] = '\0';
    return already;
}
Example #3
0
File: net.c Project: baptr/core
int RecvSocketStream(int sd, char buffer[CF_BUFSIZE], int toget)
{
    int already, got;

    if (toget > CF_BUFSIZE - 1)
    {
        Log(LOG_LEVEL_ERR, "Bad software request for overfull buffer");
        return -1;
    }

    for (already = 0; already != toget; already += got)
    {
        got = recv(sd, buffer + already, toget - already, 0);

        if ((got == -1) && (errno == EINTR))
        {
            continue;
        }

        if ((got == -1) && (LastRecvTimedOut()))
        {
            Log(LOG_LEVEL_ERR, "!! Timeout - remote end did not respond with the expected amount of data (received=%d, expecting=%d): %s",
                already, toget, GetErrorStr());
            return -1;
        }

        if (got == -1)
        {
            Log(LOG_LEVEL_ERR, "Couldn't recv: %s", GetErrorStr());
            return -1;
        }

        if (got == 0)           /* doesn't happen unless sock is closed */
        {
            break;
        }
    }

    buffer[already] = '\0';
    return already;
}