繁体   English   中英

非阻塞套接字(tcp)缓冲区msg逐个处理

[英]Non-blocking socket (tcp) buffer msg handle one by one

我在我的服务器中使用epoll ,当我用sleep(2) “模拟”加载时sleep(2)

Client send: a
Client send: b
Client send: c

Server recv: abc

但是,我想要的是:

Server recv: a
Server recv: b
Server recv: c

因为我使用weboscket框架,我想要处理一个接一个。

我需要手动拆分缓冲区吗? 还是有更合理的解决方案?

static const size_t RECV_BUFFER_SIZE = 1024;

size_t tcp_recv(int fd, char **buffer)
{
    size_t buffer_size = RECV_BUFFER_SIZE;
    size_t buffer_data_len = 0;

    *buffer = (char *)malloc(buffer_size);

    for (;;) {
        //sleep(2);
        ssize_t len;

        len = recv(fd, *buffer + buffer_data_len,
            buffer_size - buffer_data_len, 0);
        buffer_data_len += len;

        if (len == -1)
            break;

        if (len == buffer_size - buffer_data_len) {
            char *new_buffer;

            buffer_size *= 2;
            new_buffer = (char *)realloc(*buffer, buffer_size);
            if (new_buffer != NULL)
                *buffer = new_buffer;
        }
    }

    (*buffer)[buffer_data_len] = '\0';
    return buffer_data_len;
}

您需要在流式TCP协议之上实现自己的协议。

两种可能的方法是:

  1. 首先发送数据的长度以固定长度格式,然后发送这个字节数。
  2. 定义用于终止具有任何长度的数据块的分隔符序列。 对于文本数据,这可以是新行序列,例如http协议使用的\\r\\n

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM