我在我的服务器中使用 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)。
两种可能的方法是:
- 首先以固定长度格式发送数据长度,然后准确发送该字节数。
- 定义一个分隔符序列,用于终止具有任意长度的数据 block 。例如,对于文本数据,这可能是换行序列,即 http 协议(protocol)使用的
\r\n
。
关于c - 非阻塞套接字(tcp)缓冲区消息逐一处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21913251/