0
我用epoll的在我的服務器,當我「模擬」負載sleep(2)
:非阻塞套接字(TCP)緩衝味精處理逐個
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;
}
客戶端由瀏覽器實現,所以我不能更改協議。但是,ws頭包含數據長度,所以我可以計算幀大小,並逐個處理緩衝區的部分,這很好。我希望有另一種方式。 – bsz