非阻塞套接字(tcp)缓冲区消息句柄逐个
我在服务器中使用epoll,当我使用非阻塞套接字(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
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协议之上实现自己的协议 两种可能的办法是:
\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;
}