m8rge / cwebsocket

cWebsocket is lightweight websocket server library
MIT License
256 stars 60 forks source link

recv == 0 #21

Open wumao opened 8 years ago

wumao commented 8 years ago

ssize_t readed = recv(clientSocket, gBuffer+readedLength, BUF_LEN-readedLength, 0);

I compile this lib use mipsel-openwrt-linux-gcc. run on router.

maybe void wsGetHandshakeAnswer(const struct handshake hs, uint8_t outFrame, *outLength) have a bad responseKey on x86 it is ok.

wumao commented 8 years ago

/* * characters used for Base64 encoding / static const char *BASE64_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

/**
* encode three bytes using base64 (RFC 3548)
*
* @param triple three bytes that should be encoded
* @param result buffer of four characters where the result is stored
*/
static void _base64_encode_triple(unsigned char triple[3], char result[4])
{
    int tripleValue, i;

    tripleValue = triple[0];
    tripleValue *= 256;
    tripleValue += triple[1];
    tripleValue *= 256;
    tripleValue += triple[2];

    for (i = 0; i<4; i++)
    {
        result[3 - i] = BASE64_CHARS[tripleValue % 64];
        tripleValue /= 64;
    }
}

/**
* encode an array of bytes using Base64 (RFC 3548)
*
* @param source the source buffer
* @param sourcelen the length of the source buffer
* @param target the target buffer
* @param targetlen the length of the target buffer
* @return 1 on success, 0 otherwise
*/
static int base64_encode(char *target, size_t targetlen, unsigned char *source, size_t sourcelen)
{
    /* check if the result will fit in the target buffer */
    if ((sourcelen + 2) / 3 * 4 > targetlen - 1)
        return 0;

    /* encode all full triples */
    while (sourcelen >= 3)
    {
        _base64_encode_triple(source, target);
        sourcelen -= 3;
        source += 3;
        target += 4;
    }

    /* encode the last one or two characters */
    if (sourcelen > 0)
    {
        unsigned char temp[3];
        memset(temp, 0, sizeof(temp));
        memcpy(temp, source, sourcelen);
        _base64_encode_triple(temp, target);
        target[3] = '=';
        if (sourcelen == 1)
            target[2] = '=';

        target += 4;
    }

    /* terminate the string */
    target[0] = 0;

    return 1;
}

use this base64_encode. from https://github.com/payden/libwebsock/blob/master/src/base64.c

yesco commented 8 years ago

Notice the call parameters are different order and return value:

base64_encode(shaHash, 20, responseKey, length);
size_t base64Length = base64len(20);

then it seems to work fine!