2014-02-20 40 views
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; 
} 

回答

2

您需要在流式TCP协议之上实现自己的协议。

两种可能的方法是:

  1. 首先发送的数据的长度进来固定长度格式,然后发送的字节的正是这种量。
  2. 定义一个分隔符序列,用于终止具有任意长度的数据块。对于文本数据,这可以是例如新行序列,即由http协议使用的\r\n
+0

客户端由浏览器实现,所以我不能更改协议。但是,ws头包含数据长度,所以我可以计算帧大小,并逐个处理缓冲区的部分,这很好。我希望有另一种方式。 – bsz