Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
非阻塞套接字(tcp)缓冲区消息句柄逐个_C_Sockets_Buffer_Nonblocking_Epoll - Fatal编程技术网

非阻塞套接字(tcp)缓冲区消息句柄逐个

非阻塞套接字(tcp)缓冲区消息句柄逐个,c,sockets,buffer,nonblocking,epoll,C,Sockets,Buffer,Nonblocking,Epoll,我在服务器中使用epoll,当我使用sleep(2)“模拟”加载时: 但是,我想要的是: 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_si

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

但是,我想要的是:

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协议之上实现自己的协议

两种可能的办法是:

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

  • 客户端由浏览器实现,所以我不能更改协议。但是,ws-header包含数据长度,因此我可以计算帧大小,并逐个处理缓冲区的各个部分,这很好。我希望还有别的办法。
    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;
    }