int tcpclient_readline(tcpclient_t* cli,
                       char* userbuf, int buf_size, int timeout)
{
    int n = 0;
    int i = 0;

    if (cli->pushed_back > 0) {
        userbuf[i] = cli->pushed_back;
        i++;
        cli->pushed_back = -1;
    }
    for (; i < buf_size; ++i)
    {
        char ch;
        n = tcpclient_read(cli, &ch, 1, timeout);
        if(n < 0)
          printf("n : %d\n", n);
        if (n <= 0)
        {
            printf("err: no linefeed(i=%d, n:%d)\n",i,n);
            break; // error
        }
        if (ch == '\n' || ch == '\r')
        {
            userbuf[i++] = ch;
            break; // success
        }
        userbuf[i] = ch;
    }

    if (i >= buf_size) { // No CR or LF found.
        --i;
        cli->pushed_back = userbuf[buf_size - 1] & 0xff;
        userbuf[buf_size - 1] = '\0';
    }
    userbuf[i] = '\0';

    if (i == 0 && n <= 0) { // error
        printf("i== 0 && n:%d\n",n);
        return -1;
    }

    //printf("recv: %s", userbuf);

    return i; // the number of characters filled into user buffer.
}
int tcpclient_readline(urg_tcpclient_t* cli,
                       char* userbuf, int buf_size, int timeout)
{
    int n = 0;
    int i = 0;

    if (cli->pushed_back > 0) {
        userbuf[i] = cli->pushed_back;
        i++;
        cli->pushed_back = -1;
    }
    for (; i < buf_size; ++i) {
        char ch;
        n = tcpclient_read(cli, &ch, 1, timeout);
        if (n <= 0) {
            break; // error
        }
        if (ch == '\n' || ch == '\r') {
            break; // success
        }
        userbuf[i] = ch;
    }

    if (i >= buf_size) { // No CR or LF found.
        --i;
        cli->pushed_back = userbuf[buf_size - 1] & 0xff;
        userbuf[buf_size - 1] = '\0';
    }
    userbuf[i] = '\0';

    if (i == 0 && n <= 0) { // error
        return -1;
    }

    return i; // the number of characters filled into user buffer.
}