c - 非阻塞套接字(tcp)缓冲区消息逐一处理

标签 c sockets buffer nonblocking epoll

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

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

Server recv: abc

但是,我想要的是:

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

因为我用的是weboscket frames,而且我要handle一个一个的

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

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 协议(protocol)之上实现您自己的协议(protocol)。

两种可能的方法是:

  1. 首先以固定长度格式发送数据长度,然后准确发送该字节数。
  2. 定义一个分隔符序列,用于终止具有任意长度的数据 block 。例如,对于文本数据,这可能是换行序列,即 http 协议(protocol)使用的 \r\n

关于c - 非阻塞套接字(tcp)缓冲区消息逐一处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21913251/

相关文章:

c - C 中的缓冲和非缓冲输入

c++ - 在线程之间发送和读取字符串

c - C 中的文件 I/O - 如何从文件读取然后写入文件?

Java : How setup an SSL One-Way authentification for a server-client over a LAN?

python - 在 Python 中切片文件

java - Android - 源端口 800 的 DatagramSocket 不发送

c - listen() 忽略积压值

c - 如何防止特定动态库被加载

C 值在添加后从链表中删除

c - gcc-linux-gnueabi-arm 错误 undefined reference to `main'