从套接字读取时追加到缓冲区

append to buffer while reading from socket

您好,我正在尝试实现 TCP 套接字流。我有一个大小为 12 的缓冲区,我正在循环读取此缓冲区。

我希望每次读取调用都会将读取操作添加到缓冲区中,直到缓冲区已满,但相反,它从缓冲区的开头开始,每次迭代都会覆盖缓冲区中已有的内容。

如何在每次读取时附加到缓冲区,以便保留之前的字节?

void *th_read(void *arg)
{
    reader_arg_t *rArg = (reader_arg_t *)arg;
    int buf_size = 12;
    int bytes_recevied, rv;
    char buf[buf_size];
    while (1)
    {
        rv = 0;
        bytes_recevied = rv;
        memset(buf, 0, buf_size);
        socket_context_t ctx;
        tsq_dequeue(rArg->reader_queue, &ctx);
        printf("reading from socket: %i\n", ctx.sockfd);
        while (1)
        {
            rv = read(ctx.sockfd, buf, buf_size - bytes_recevied);
            if (rv < 1)
                break;
            bytes_recevied += rv;
            printf("bytes_recevied: %i\nbuf: %s\n", bytes_recevied, buf);
        }
        perror("read");
        close(ctx.sockfd);
        printf("%s\n", buf);
    }
}

当我连接 telnet 并通过按 enter 分隔写入 2 次时,我得到了这个输出。第一次写hello,第二次写数字1

reading from socket: 5
bytes_recevied: 7
buf: hello

bytes_recevied: 10
buf: 1
lo

我希望缓冲区包含 hello1 而不是 1\rlo

我发现了一个显示零字节的问题,但它对我的用例没有用,除非我可能会使用第二个缓冲区并在每次读取时从第一个缓冲区添加内容直到零字节。

reading buffer from socket

您应该将缓冲区的新位置发送到读取函数。

rv = read(ctx.sockfd, buf + bytes_received, buf_size - bytes_recevied);